1
struct that
{
    that &frob()
    {
        return *this;
    }
    that frob() const
    {
        return that(*this);
    }

    //that &&frob() && //<-called only if *this is an rvalue
    //{
    //    return move(*this);
    //}

    that()
    {
        // make things
    }
    that(const that &other)
    {
        // copy things
    }
    that(that &&other)
    {
        // move things
    }
};

显然,上面评论中的函数不是合法的 C++,但我需要知道是否有办法做到这一点:

that().frob().frob().frob();

依此类推,而每次调用frob()都会有效地调用其“移动”版本。由于这是可以在编译时确定的,我想不出任何理由让它不以某种形式存在。

我可以这样写:

that &&frob(that &&t)
{
    return t;
}

这将导致:

frob(frob(frob(that())));

这读起来有点烦人,也没有实现我用委托“拼写出来”的目标。

4

2 回答 2

2

如果你想让&&注解的功能和其他人一起玩得很好,你应该在其他人身上使用&注解。

that &frob() &
{
    return *this;
}
that frob() const &
{
    return that(*this);
}
于 2012-07-26T11:56:36.467 回答
0

不,没有办法确定对象是否是对象内的右值。你能做的最好的就是复制它,如果不是const,移动它:

that frob() const
{
    return *this;
}

that frob()
{
    return std::move(*this);
}

编辑

正如@Potatoswatter 指出的那样,进一步的研究表明您实际上可以,但它称为 ref-qualification 而不是注释。

于 2012-07-26T12:12:41.553 回答