次のオブジェクトを検討してください。
class Obj
{
public:
Obj() : val(new int(1)) {}
int& get() {return *val;}
const int& get() const {return *val;}
private:
std::shared_ptr<int> val;
};
予想どおり、オブジェクトが構築されてコピーが作成されると、Obj によって公開された shared_ptr を介してすべて同じ値を変更できます。
Obj nonconst1;
Obj nonconst2(nonconst1);
nonconst2.get() = 2;
cout << nonconst1.get() << ", " << nonconst2.get() << endl;
非 const の 1 つからオブジェクトをコピー構築することも可能const Obj
です。これは、値の読み取りは許可するが書き込みは許可しないという点で正しいことを行うようです。予想どおり、次のコードはコンパイル エラーになります。
const Obj const1(nonconst1);
const1.get() = 3;
ただし、const オブジェクトから非 const Obj をコピー構築することは可能であり、これによって値を変更することができます。
Obj nonconst3(const1);
nonconst3.get() = 3;
私には、これは const-correct とは思えません。
コピー コンストラクターの動作を許可しながら、この動作を防ぐ方法はありますか? 私の実際の使用例では、Obj の std コンテナーを使用できるようにしたいと考えています。