変更可能と宣言された C++ クラス フィールドがあります。double 型の場合は、const メソッドで問題なく変更できました。しかし、そのタイプを operator= がオーバーロードされているクラスに切り替えると、このオーバーロードされた operator= はこれへの const ポインターをとらないというエラーが発生しました。これは gcc のバグですか、それとも言語の癖ですか?
2 に答える
コンパイラのバグが疑われる場合は、使用しているコンパイラのバージョンを指定する必要があります。あなたが知っている、バグは毎日殺されます。
とにかく、このコードはGCC4.6.3で正常にコンパイルされます。
struct A
{
void operator=(int)
{
}
};
struct B
{
mutable A a;
};
int main()
{
const B b;
b.a = 42;
}
しかし、もちろん、これはそうではありません(これはあなたの場合です):
struct A
{
mutable int m;
void operator=(int x)
{
m = x;
}
};
struct B
{
A a;
};
int main()
{
const B b;
b.a = 42;
}
mutable
const
暗黙のオブジェクトパラメータの修飾が無効になる効果があります( 5.2.5クラスメンバーアクセス[expr.ref]、段落4):
[...]
E2
がメンバーであると宣言されている場合mutable
、のタイプE1.E2
は「<em>vq12T
」です。E2
がメンバーとして宣言されていない場合mutable
、のタイプE1.E2
は「<em>cq12vq12T
」です。
5.2.5は、9.3.1p3に従って暗黙的なメンバーアクセスに適用されます。
id-expression [...]がクラス
X
[...]のメンバーで使用される場合、 id- expressionは、演算子の左側の接尾辞式(*this)
として使用するクラスメンバーアクセス式に変換されます。.
したがって、あなたのconst
メソッドでは、mutable
メンバーはconst-qualifiedではありません(観察されます)。観察された動作は、コンパイラのバグの結果である必要があります。