1

私はこれがOKであることを知っています:

struct Foo {
    Foo& operator=( Foo& ) = delete; // disallow assign
    Foo( int ) { }                   // some basic constructor
    Foo( const Foo& ) = delete;      // disallow copy
    Foo( Foo&& ) { }                 // allow move
};

Foo getFoo( void ) {
    return Foo( 3 );
}
Foo foo = getFoo( ); // uses move constructor

一方、これはコピー コンストラクターを使用するため、無効です(また、コピー コンストラクターを持つFooオブジェクトの場合、有効ですが非効率的です)。

const Foo getConstFoo( void ) {
    return Foo( 3 );
}
const Foo constFoo = getConstFoo( ); // error: copy constructor is deleted!

しかし、これは問題ありません: (そして の寿命を延ばしますconstFooRef)

const Foo& constFooRef = getConstFoo( ); // uses move constructor

さて、2番目のケースが呼び出されます

Foo( const Foo&& ) { }

利用可能な場合。constしたがって、最終的なオブジェクトがそのコンストラクター内からのものであることを検出する方法があるかどうかを知りたいです。存在する場合は、ムーブ セマンティクスを適用し (関連するオブジェクトは両方とも const であり、パラメーターは他の場所で使用されていないため、const ネスをキャストしても問題ありません)、2 番目のケースを有効にします。

したがって、私の質問のタイトルは私が達成しようとしている最終結果を説明していますが、私の副問題は、オブジェクトが構築された後に const になるかどうかを検出することです (素朴に試してみFoo( const Foo&& ) const { }ましたが、運がありません!)

4

1 に答える 1

0

あなたはするかもしれません

Foo::Constant getConstFoo( void ) {
    return Foo::Constant( 3 );
}

Foo::Constant は不変です

struct Foo {
    struct Constant
    {
       Constant(Foo&&);
    };
    Foo& operator=( Foo& ) = delete; // disallow assign
    Foo( int ) { }                   // some basic constructor
    Foo( const Foo& ) = delete;      // disallow copy
    // You might not use: Foo( Foo&& ) { }                 // allow move
};
于 2013-08-10T13:18:09.920 に答える