Możliwość przypisania kopii obiektu do const referencji

0

Ostatnio, przez zupełny przypadek, zauważyłem, ze przypisuję lokalny obiekt do const referencji i wszystko się kompiluje bez błędów. Po usunięciu const nie daje sie skompilować. Jest błąd:

error: cannot bind non-const lvalue reference of type ‘Foo&’ to an rvalue of type ‘Foo’

Kod jest taki:

struct Foo {};

Foo getFoo() { return {}; }

int main(int argc, char* argv[]) {
//  const Foo& foo = getFoo();
    Foo& foo = getFoo();

    return 0;
}

Jeśli spróbuje się skompilować taki kod to pokaże się ww. błąd i oczywiście nie jest to nic dziwnego bo próbuje się przypisać do referencji na obiekt Foo obiektu lokalnego, który "zniknie" po zakończeniu (po wyjściu) funkcji getFoo().

Ale... jeśli odkomentu się linijkę 6, a zakomentuje 7, czyli gdy tylko doda się const do referencji na Foo, to kompiluje sie wszystko bez problemów.

Nie rozumiem dlaczego obiekt (albo wartość prosta, bo to wcale nie musi być obiekt) wyjścia z funkcji poprzez kopię (bo funkcja getFoo zwraca obiekt Foo przez wartość, a nie przez referencję) można przypisać bez problemów do referencji na stały obiekt ale już nie na obiekt bez kwalifikatora const?
Wg mnie referencja to referencja czyli kolejny uchwyt do już istniejącego obiektu, const tylko nakłada dodatkowe warunki na dany obiekt.
Jeśli zatem występuje błąd przy próbie przypisania kopii obiektu Foo do non-const ref, to i powinien (wg mnie, tak łopatologicznie rozumując) wystąpić przy próbie przypisania kopii obiektu Foo do const ref. Czego tu nie ogarniam?

Kompiluję przy pomocy g++ przy domyślnych opcjach optymalizacji.

2

Odpowiedź jest prosta.
Próbujesz przypisać do referencji obiekt prawostronny (tymczasowy).
const reference inicjuje Tobie obiekt w gratisie więc takie przypisanie jest możliwe.

Foo& foo0 = {} // bład wartość prawostronna - tymczasowa
Foo& foo1{}; //bład inicjator referencji
const Foo& foo2{}; // OK - inicjator
0

@malencki: Faktycznie, nawet na cppreference jest o tym napisane. Właśnie czytam. Ponadto dowiedziałem się właśnie, że lifetime obiektu tymczasowego, może być wydłużony, gdy jest związany z const ref. O tym jest napisane tym razem w tym artukule również na cppreference: Temporary object lifetime.

Temat wyjaśniony

Dzięki wielkie i pozdrawiam serdecznie

1 użytkowników online, w tym zalogowanych: 0, gości: 1