未定義の動作です。C++11 標準のパラグラフ 7.1.6.1/4 によると:
宣言されたクラス メンバー (7.1.1) を変更できることを除いて、
オブジェクトの有効期間中 (3.8) にオブジェクトmutable
を変更しようとすると、未定義の動作が発生します。const
この場合、構築後にオブジェクトを「一定にする」必要があるようです。これは不可能です。
vector
が意図されている場合const
は、コンストラクターの初期化リストで初期化する必要があります。
qqq(vector<foo>& other)
: my_foo(std::move(other))
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
}
ポインターによる受け渡しに正当な理由がない限り (その場合は、ポインターが null でないかどうかも確認する必要があります)、一般的な方法である (上記のように) 参照による受け渡しを検討する必要があることに注意してください。
アップデート:
Pete Becker がコメントで正しく指摘しているように、適切な設計では、引数から移動する決定は、コンストラクター自体ではなく、 のコンストラクターの呼び出し元にvector
属する必要があることが示唆されます。qqq
コンストラクターが常にその引数から移動することになっている場合は、コンストラクター自体が呼び出し元に何を期待しているかを明確にして、rvalue 参照を受け入れさせることができます。
qqq(vector<foo>&& other)
// ^^
: my_foo(std::move(other))
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
}
このように、呼び出し元はのコンストラクターへの入力で右辺値を提供する必要があります。qqq
std::vector<foo> v;
// ...
qqq q1(v); // ERROR!
qqq q2(std::move(v)); // OK! Now the client is aware that v must be moved from