次のコードが有効な理由:
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 を使用しています。
ありがとう
編集 1: リテラル "Hello World" を std::string("Hello World") に変更して右辺値を作成しました。