定数として宣言されたオブジェクトを変更することが UB であることは知っています。タイトルで言及されているより複雑な例はどうですか?
class Foo
{
public:
Foo ( void ) { }
int data;
};
int main ( void )
{
const Foo foo;
const_cast<Foo&>(foo).data = 0; // UB?
return 0;
}
data
非 const として宣言されているので、変更しても問題ありません。ただし、foo
constとして宣言されています。そのため、変更することはできないようです。したがって、ここで UB が呼び出されると思います。私は正しいですか?
更新:実際には UB であることがわかります。これは、可変メンバーを変更する偽の定数メンバーを持つすべてのクラスが、定数インスタンスで UB を生成することを意味します。
class Foo
{
public:
mutable int data;
Foo ( void ) { }
void foo ( void ) const
{
some_modifications_of_data();
}
};
const Foo foo;
foo.foo(); // UB?
この種のクラスを設計する場合、いかなる状況下でも誰もこのメソッドを定数インスタンスで呼び出すことができないことを明示的に言及する必要があるということですか?