¿Por qué el siguiente código válido:¿Por qué se debe modelar una función de reenvío perfecta?
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
Pero no:
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
¿Por qué el valor-I en el ejemplo 2 se resuelven de la misma manera que lo hace en el ejemplo 1?
Además, ¿por qué la norma considera importante proporcionar el tipo de argumento en std :: forward frente a simple deducción? Simplemente llamar hacia adelante muestra intención, independientemente del tipo.
Si esto no es una cosa estándar y solo mi compilador, estoy usando msvc10, lo que explicaría el mal soporte de C++ 11.
Gracias
Edición 1: Se ha cambiado el literal "Hola Mundo" a ser std :: string ("Hola mundo") para hacer una rvalue.
¿Qué sucede en la barra? Compilar no significa que esté funcionando necesariamente. Creo que debería ser 'void foo (T1 & arg)' y 'void foo (std :: string & arg)' respectivamente. – AJG85
'" Hello World "' no es un valor r, es un valor l con el tipo 'const char [12]'. – GManNickG
@ AJG85 Lo que sucede en la barra no es importante. && significa referencia de valor r. – Mranz