为什么以下代码有效:
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
为什么示例 2 中的左值没有以与示例 1 中相同的方式解析?
此外,为什么标准认为需要在 std::forward 中提供参数类型而不是简单地推导它很重要?简单地向前呼叫表示意图,无论类型如何。
如果这不是标准的东西而只是我的编译器,我正在使用 msvc10,这将解释糟糕的 C++11 支持。
谢谢
编辑 1:将文字“Hello World”更改为 std::string("Hello World") 以生成右值。