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 に答える