C++ 右值委托,或与常量成员函数等价的右值
依此类推,而每次调用C++ 右值委托,或与常量成员函数等价的右值,c++,c++11,rvalue,C++,C++11,Rvalue,依此类推,而每次调用frob()都会有效地调用其“move”版本。因为这是可以在编译时确定的,所以我想不出任何理由让它以某种形式不存在 我可以这样写: that().frob().frob().frob(); 这将导致: that &&frob(that &&t) { return t; } 读起来有点烦人,也不能实现我通过授权“把事情说清楚”的目标。如果你想让&注释函数与其他函数配合良好,你应该在其他函数上使用&注释 frob(frob(frob(t
frob()
都会有效地调用其“move”版本。因为这是可以在编译时确定的,所以我想不出任何理由让它以某种形式不存在
我可以这样写:
that().frob().frob().frob();
这将导致:
that &&frob(that &&t)
{
return t;
}
读起来有点烦人,也不能实现我通过授权“把事情说清楚”的目标。如果你想让
&
注释函数与其他函数配合良好,你应该在其他函数上使用&
注释
frob(frob(frob(that())));
否,无法从对象内部确定对象是否为右值。如果它是
const
,则最好复制它,如果不是,则移动它:
that &frob() &
{
return *this;
}
that frob() const &
{
return that(*this);
}
编辑
进一步的研究表明,实际上,正如Potatoswatter指出的,但它称为REF资格而不是注释。< /P>这是使用英特尔C++ V12编译错误:<代码>错误:预期A′;code>@i\u光子嗯,这个缺失的特性破坏了右值
这个
的许多有用性。对不起,MSC也一样:c@i_photonICC是其中一个更好的…它在GCC4.7中也有类似的错误,但是Clang3.1工作得很好,并且做了您描述的that().frob().frob().frob()代码>。实际上,Clang是目前唯一一个为*this
支持右值的编译器。请注意,*this
始终是左值。很容易将*此
与“隐式实例参数”混淆。
that &frob() &
{
return *this;
}
that frob() const &
{
return that(*this);
}
that frob() const
{
return *this;
}
that frob()
{
return std::move(*this);
}