次のコードがあるとします。
class foo;
foo* instance = NULL;
class foo
{
public:
explicit foo(int j)
: i(j)
{
instance = this;
}
void inc()
{
++i;
}
private:
int i;
};
以下は定義された動作を使用していますか?
const foo f(0);
int main()
{
instance->inc();
}
クラスレジストリを使用しているので質問しています。直接変更しないf
ので、それを作成するといいのですconst
が、後でf
レジストリによって間接的に変更されます。
編集:定義された動作とは、つまり、オブジェクトは一度しか書き込めない特別なメモリ位置に配置されているということですか? 少なくとも C++1x の constexpr までは、読み取り専用メモリは問題外です。たとえば、定数プリミティブ型は (多くの場合) 読み取り専用メモリに配置され、const_cast
それに対して a を実行すると、次のような未定義の動作が発生する可能性があります。
int main()
{
const int i = 42;
const_cast<int&>(i) = 0; // UB
}