次のコードはVC2010を失敗させます:
//code1
std::string& test1(std::string&& x){
return x;
}
std::string str("xxx");
test1(str); //#1 You cannot bind an lvalue to an rvalue reference
//code2
std::string&& test1(std::string&& x){
return x; //#2 You cannot bind an lvalue to an rvalue reference
}
#1を説明する記事がいくつかありますが、#2も失敗する理由がわかりません。
std::moveがどのように実装されるか見てみましょう
template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&&
move(_Ty&& _Arg)
{ // forward _Arg as movable
return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}
- moveの引数はまだ右辺値の参照ですが、move(str)は問題ありません。
- moveも右辺値を返します。
std:moveの魔法は何ですか?
ありがとう