Por que uma função de encaminhamento perfeito precisa ser modelada?

Por que o código a seguir é válido:

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

Mas não

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 que o valor l no exemplo 2 não é resolvido da mesma maneira que no exemplo

Além disso, por que o padrão considera importante a necessidade de fornecer o tipo de argumento em std :: forward versus simples dedução? Simplesmente ligar para frente está mostrando intenção, independentemente do tip

Se isso não for algo padrão e apenas o meu compilador, estou usando o msvc10, o que explicaria o péssimo suporte ao C ++ 1

Obrigad

Edit 1: O literal "Hello World" foi alterado para ser std :: string ("Hello World") para gerar um rvalo

questionAnswers(1)

yourAnswerToTheQuestion