Próbowałem zrozumieć lwartości i wartości w C++ 11. Więc napisałem kod testowy:Dlaczego powiązanie odwołania rvalue do wartości xvalue nie działa w moim kodzie?
int x = 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }
int main() {
int& lr1 = 10; // error: lvalue references rvalue
int& lr2 = x; // ok
int& lr3 = foo(); // error: lvalue references rvalue
int& lr4 = bar(); // ok
int& lr5 = baz(); // error: lvalue references rvalue
int&& rr1 = 10; // ok
int&& rr2 = x; // error: rvalue references lvalue
int&& rr3 = foo(); // ok
int&& rr4 = bar(); // error: rvalue references lvalue
int&& rr5 = baz(); // ok
}
działa całkiem dobrze, więc dodaje std :: cout wydrukować wyniki.
#include <iostream>
int x= 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }
int main() {
int& lr1 = 10; std::cout << lr1 << std::endl; // error
int& lr2 = x; std::cout << lr2 << std::endl; // ok
int& lr3 = foo(); std::cout << lr3 << std::endl; // error
int& lr4 = bar(); std::cout << lr4 << std::endl; // ok
int& lr5 = baz(); std::cout << lr5 << std::endl; // error
int&& rr1 = 10; std::cout << rr1 << std::endl; // ok
int&& rr2 = x; std::cout << rr2 << std::endl; // error
int&& rr3 = foo(); std::cout << rr3 << std::endl; // ok
int&& rr4 = bar(); std::cout << rr4 << std::endl; // error
int&& rr5 = baz(); std::cout << rr5 << std::endl; // ERROR!?
}
int&& rr5 = baz(); std::cout << rr5;
powoduje Runtime Error, ale nie wiem, dlaczego to robi błąd.
Myślę, że wartość zwracana baz()
byłaby xvalue, więc jego żywotność jest przedłużona. Ale kiedy próbowałem uzyskać dostęp do jego wartości, wystąpił błąd. Czemu?
Podczas zadawania pytań o budowę błędy, proszę podać rzeczywisty błąd (w całości, kompletny, bez edycji, kopia wklejone jako tekst) w organizmie zapytania. –
Oh sorry. Powoduje błąd w czasie wykonywania. –
"xvalue, więc to życie jest przedłużone" byłoby błędem. C++ wydłuża czas życia * tymczasowych *, a nie wartości l, wartości i wartości. Czyni to, gdy odniesienie jest związane z takim obiektem tymczasowym. W wyrażeniu nie ma obiektu tymczasowego. Co więcej, 'bar' i' baz' zarówno wywołują niezdefiniowane zachowanie, jeden zwracając odwołanie do lokalnego obiektu, jak i drugi, nie zwracając niczego. –