私はこれが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 { }
ましたが、運がありません!)