2

私は次のようなコードを持っています

std::vector<std::unique_ptr<int>> v;
std::unique_ptr<int> a(new int(0));
std::unique_ptr<int>& b = a;
v.insert(v.begin(), std::move(b)); //ok

ただし、3番目のステートメントにconstを追加すると

const std::unique_ptr<int>& b = a;
v.insert(v.begin(), std::move(b)); //Compiler error, cannot access ptr private member

constをnon-constに変換できない以外に、コンパイラが一意のポインタのプライベートメンバーにアクセスできないことを示すのはなぜですか?ありがとう。

4

1 に答える 1

3

オブジェクトを移動することはできませんconst。移動とは、移動元のオブジェクト(そのオブジェクトのタイプが何であれ)の状態を変更するconstことを意味し、その状態を変更しないことを約束するものとして宣言します。したがって、constオブジェクトを移動することは、用語の矛盾です。

オブジェクトを移動できるという期待にconstは確かに何らかの正当性があるかもしれませんが(たとえば、オブジェクトをconst 使用している限りオブジェクトを長くし、作業が終わったらオブジェクトを取り除き、その内臓を転送することができます)。それをコピーするのではなく(これはunique_ptr)では不可能ですが、実際にこれを許可すると、非常に非現実的なセマンティックな結果が多数発生します(たとえば、2つのオブジェクトを交換constできるようになります)。

したがって、言語がconstオブジェクトからの移動を技術的に許可している場合でも(constRRefを受け入れる移動コンストラクターは有効です)、を含め、標準ライブラリのどのタイプも実際にその可能性を提供unique_ptrしません。そのようなUDTを作成しないでください。

概念的には、移動を状態変更操作と考えることが非常に重要です。これは、修飾子と互換性がありません。const

于 2013-01-24T23:15:40.727 に答える