Почему действует следующий код:
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
Но не:
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
Почему lvalue в примере 2 не разрешается так же, как в примере 1?
Кроме того, почему стандарт считает важным предоставить тип аргумента в std:: forward или simple, выведя его? Просто вызов вперед показывает намерение, независимо от типа.
Если это не стандартная вещь и только мой компилятор, я использую msvc10, что объясняет дерьмовую поддержку С++ 11.
Спасибо
Изменить 1: изменил литерал "Hello World" как std::string ( "Hello World" ), чтобы сделать rvalue.