Komunikat kompilator to jedna z tych wiadomości, że nie ma sensu z punktu widzenia języka, ale ujawniają wewnętrzne funkcjonowanie kompilator, sekwencja, w której jego wewnętrzne prace logiczne.
W twoim przypadku używasz wartości r (NULL
) do zainicjowania odniesienia. Gdy taka inicjalizacja jest dozwolona, wartość rna jest konwertowana na obiekt tymczasowy, do którego odniesienie zostanie powiązane. Tak więc kompilator zdał sobie z tego sprawę od razu i poinformował o tym fakcie komunikatem diagnostycznym.
W rzeczywistości jednak taka sztuczka jest dozwolona tylko dla referencji const
, więc Twój kod jest uszkodzony, ponieważ w naszym przypadku referencja nie jest const
. Ponadto, odniesienie struct
, jak w kodzie, nie może zostać zainicjowane za pomocą 01:rwartości (która ma typ integralny), więc jest również z tego powodu zepsute.
Komunikat kompilatora jest jednak mylący. Tekst komunikatu wydaje się sugerować, że inicjowanie referencji członków za pomocą obiektów tymczasowych jest nielegalne. W rzeczywistości jest to legalne w C++ (gdy powyższe problemy zostaną naprawione), chociaż nie ma to sensu. Ale, myślę, gdy kod źle sformułowane towarzyszy przynajmniej jakiś komunikat o błędzie, powinno być OK dla każdego ...
Generalnie nie jest prawdą, że nie można domyślnie utworzyć klasy z elementem referencyjnym. Na przykład odwołanie może być powiązane z obiektem zadeklarowanym w zasięgu obszaru nazw (obiekt "globalny", w prostszych słowach). – AnT
Jak już wspomniano, możesz użyć domyślnego konstruktora, jeśli używasz predefiniowanej zmiennej (jak w moim przykładzie poniżej). –
Obaj jesteście poprawni. Odradzam jednak używanie globalnej wartości "zerowej" - nie może ona być stała, więc domyślnym zachowaniem byłoby użycie obiektu globalnego, który może zmienić dowolne inne wystąpienie klasy bez powiadomienia. –