C++ でメソッドを持つというconst
ことは、オブジェクトがそのメソッドを介して読み取り専用であることを意味しますが、それ以外の場合でも変更される可能性があることを理解しています。
const
ただし、このコードは参照を介して (つまり、const
メソッドを介して)オブジェクトを変更しているようです。
このコードは C++ で合法ですか?
const
もしそうなら:それは型システムの性質を壊していますか?なぜ/なぜしないのですか?
そうでない場合:なぜですか?
注 1: 例を少し編集したので、回答は古い例を参照している可能性があります。
編集 2: どうやら C++11 も必要ないので、その依存関係を削除しました。
#include <iostream>
using namespace std;
struct DoBadThings { int *p; void oops() const { ++*p; } };
struct BreakConst
{
int n;
DoBadThings bad;
BreakConst() { n = 0; bad.p = &n; }
void oops() const { bad.oops(); } // can't change itself... or can it?
};
int main()
{
const BreakConst bc;
cout << bc.n << endl; // 0
bc.oops(); // O:)
cout << bc.n << endl; // 1
return 0;
}
アップデート:
ラムダをコンストラクターの初期化リストに移行しました。これにより、const BreakConst bc;
後で.コンストラクターと呼び出し元は、互いの定義を確認しないとこれを知る方法がありませんが、構築後は未定義の動作になるはずです。bc
bc