2014-12-22 22 views
16

C++ 11 - rvalue referans değişkenler

int a = 42; 

ve

int&& rvr = 42; 

arasındaki fark nedir?

a besbelli bir lvalue olmakla rvr o adlandırılmış değişkendir, bu nedenle bu ifadeler aynen eşdeğer kabul edilebilir çünkü aynı zamanda bir lvalue olduğunu ve değilse, int&& beyan tercih edildiği senaryolar içinde?

+0

Bu [soru] 'u okudunuz mu (http://stackoverflow.com/questions/10228264/use-of-rvalue-reference-and-auto)? Bu 'auto' ile ilgili, ama cevaplar, sorularınızı açıklığa kavuşturabilir. –

+0

http://www.codesynthesis.com/~boris/blog/2008/11/24/rvalue-reference-basics/ –

cevap

14

Tam olarak eşdeğer değiller. Her iki değişken Sol taraf olduklarını haklısın ama forma

T a = b; 

türlerinin çoğu, başlangıç ​​noktaları için geçici T nesnesi oluşturur ve daha sonra bu geçici nesneden a oluşturur. Bu geçici nesne seçilebilir, ancak yine de uygun kurucuların kullanılabilir olmasını gerektirir. Öte yandan

T &&a = b; 

, b doğrudan a bağlar, ancak bir rvalue olduğu b gerektirir. Yani:

int a = 3; 
// int&&b = a; // error: && cannot bind to lvalues 
int b = a; // okay 

struct S { S(const S &) = delete; }; 
S f(); 
// S s = f(); // error: no copy or move constructor available 
S&&s = f(); // okay 

Ve daha basitçe, decltype da referanslar için farklı sonuçlar verecektir.

+0

'[] (auto && x) {f (std :: forward (x)) kullanımı ; } '&&' ve 'decltype' kullanımı için pratik bir örnektir. – Yakk

+0

@Yakk Doğru, ama bu C++ 14, C++ 11 değil. C++ 11'de, "decltype" aynı şekilde kullanılabilir, ancak lambda veya işlev parametreleri 'auto' olarak bildirilemediğinden, bu belirli model geçerli değildir. – hvd

+0

S f(); orada mı –