2014-10-14 15 views
7

BiorącCo oznacza przyjmowanie adresu referencyjnego wartości rvalue?

void foo(int&& x) { 

    std::cout << &x; 
} 

To działa, ale co to właściwie reprezentować adres? Czy jest tymczasowy int utworzony po wywołaniu foo i co oznacza adres? Jeśli to prawda i jeśli napiszę int y = 5; foo(static_cast<int&&>(y));, czy spowoduje to utworzenie innego tymczasowego, czy też kompilator inteligentnie odwoła się do y?

+0

Nie musi być tymczasowy. Nic nie powstrzyma cię przed zrobieniem 'int x = 42; foo (x); ' –

+1

FWIW, twoja obsada to po prostu' std :: move (y) '. – chris

+3

@IgorTandetnik, To nie będzie się kompilować, ponieważ odwołania rvalue nie wiążą się z wartościami l. – chris

Odpowiedz

7

Po podaniu adresu wartości rurnue, zwraca wskaźnik do obiektu, do którego odniesienie jest przypisane, podobnie jak w przypadku odniesień lvalue. Obiekt może być tymczasowy lub nie (jeśli na przykład rzutujesz wartość l do wartości rurnu, tak jak robisz to w swoim kodzie).

int y = 5; foo(static_cast<int&&>(y)); nie tworzy tymczasowego. Konwersja ta jest opisana w części 5.2.9/3 normy:

glvalue klasy prvalue lub matryca prvalue typu „cv1 T1” może być rzutowany na typ „odnosi RValue do cv2 T2” czy „cv2 T2” to odniesienie zgodny z "cv1 T1".

Tymczasowy zostanie utworzony, jeśli na przykład zadzwonisz pod numer foo(1);.

+0

Mówiąc o wartościach r, wolę używać terminu "zmienne anonimowe" zamiast "obiektów temporalnych". Mniejsza jest więc gadatliwość: "std :: move uczynił obiekt anonimowym", a "int && x" wiąże się z anonimowymi liczbami całkowitymi –

+1

@ Peregring-lk możesz to zrobić, jeśli piszesz swój blog lub rozmawiasz z ludźmi, z którymi znasz przez długi czas, lub powinieneś odwołać się do jakiegoś źródła, ponieważ nie ma definicji "anonimowego obiektu" w standardzie C++. Odpowiadając tutaj, myślę, że lepiej jest używać terminów, które wszyscy znają, lub przynajmniej mogą znaleźć się w dobrze znanym miejscu . –