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);
}