Neden geçerli Aşağıdaki kod edilir:Mükemmel bir yönlendirme işlevi neden standartlaştırılmalıdır?
template<typename T1>
void foo(T1 &&arg) { bar(std::forward<T1>(arg)); }
std::string str = "Hello World";
foo(str); // Valid even though str is an lvalue
foo(std::string("Hello World")); // Valid because literal is rvalue
Ama:
void foo(std::string &&arg) { bar(std::forward<std::string>(arg)); }
std::string str = "Hello World";
foo(str); // Invalid, str is not convertible to an rvalue
foo(std::string("Hello World")); // Valid
Neden örnek 2'de lvalue örneğin 1'de yok aynı şekilde çözülmesini almaz? Ayrıca, standart neden argüman türünü std :: forward'a basit bir şekilde çıkarmayı gerektirecek şekilde sağlamasının önemli olduğunu düşünüyor? Neden? Basitçe söylemek gerekirse, türden bağımsız olarak niyet göstermektir.
Eğer bu standart bir şey değilse ve sadece derleyicim değilse, ben msvc10 kullanıyorum, bu da crappy C++ 11 desteğini açıklıyor.
Teşekkür
Düzenleme 1: literal "Merhaba Dünya" Değişti std edilecek :: bir rvalue yapmak için dize ("Merhaba Dünya").
Barda ne olur? Derleme, zorunlu olarak çalıştığı anlamına gelmez. Sırasıyla void foo (T1 & arg) ve void foo (std :: string & arg) olması gerektiğine inanıyorum. – AJG85
'' '' '' '' '' '' '' '' '' '' '' '' ''' Merhaba Dünya' 'bir rıhtım değil,' const char [12] 'türünde bir değerdir. – GManNickG
@ AJG85 Barda ne olduğu önemli değil. && rvalue referansı demektir. – Mranz