私は現在、r値参照と移動セマンティクスを行っていますが、私自身のコーディング実験では奇妙な矛盾が見られます。std :: forwardを使用すると、なぜr値を渡している間にl値参照関数を呼び出せるのですか?
#include <iostream>
using namespace std;
class X{};
void g(X&& t) // A
{
cout << "Rref call" << endl;
}
void g(X& t) // B
{
cout << "Lref call" << endl;
}
template<typename T>
void f(T&& t)
{
g(forward<T>(t));
}
int main()
{
X x;
f(x); // 1
f(X()); // 2
return 0;
}
がここに予想される出力を生成します:
Lrefを呼び出し
Rrefのコール
をしかし、私は先に行くと場合は、以下のコードを考えると
r値参照を取るオーバーロードされた関数gを削除する(コメント行// A)に上記の表記、私は次のような出力が得られます。
Lrefを呼び出し
Lrefを呼び出し、この作品をどのよう
?なぜコンパイラはX&&
を渡そうとしているときにg(X& t)
への呼び出しに不平を言いませんか?
Visual Studioを使用していますか?もしそうなら、それは[非標準的な拡張子](http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-a-temporary-object)から一時変数を非const参照にバインドすることができます。この例では失敗します(http://ideone.com/TcJbJA)。 –
James、それはまさにそれに見えます。論理が起こっているのを理解しようとしていた。とても感謝しております。 – Joefers