C++ 標準では、最初に宣言されたオブジェクトを変更することconst
は未定義の動作であると述べています。では、コンストラクタとデストラクタはどのように動作するのでしょうか?
class Class {
public:
Class() { Change(); }
~Class() { Change(); }
void Change() { data = 0; }
private:
int data;
};
//later:
const Class object;
//object.Change(); - won't compile
const_cast<Class&>( object ).Change();// compiles, but it's undefined behavior
ここでは、コンストラクターとデストラクタは呼び出し元のコードとまったく同じことを行いますが、オブジェクトを変更することは許可されており、呼び出し元は許可されていません。未定義の動作に遭遇します。
実装の下で、標準に従ってどのように機能するはずですか?