はなぜ有効な以下のコードされています完璧なフォワーディング機能をテンプレート化する必要があるのはなぜですか?
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:はstdされるリテラルの "Hello World" に変更::文字列( "Hello World" の)右辺値を作成します。
バーではどうなりますか?コンパイルが必ずしも機能しているとは限りません。私はそれが 'void foo(T1&arg)'と 'void foo(std :: string&arg)'であると信じています。 – AJG85
'' Hello World "'は右辺値ではなく、 'const char [12] '型の左辺値です。 – GManNickG
@ AJG85バーで起こることは重要ではありません。 &&は値の参照を意味します。 – Mranz