0

変更可能と宣言された C++ クラス フィールドがあります。double 型の場合は、const メソッドで問題なく変更できました。しかし、そのタイプを operator= がオーバーロードされているクラスに切り替えると、このオーバーロードされた operator= はこれへの const ポインターをとらないというエラーが発生しました。これは gcc のバグですか、それとも言語の癖ですか?

4

2 に答える 2

1

コンパイラのバグが疑われる場合は、使用しているコンパイラのバージョンを指定する必要があります。あなたが知っている、バグは毎日殺されます。

とにかく、このコードは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;
}
于 2012-10-31T16:35:59.280 に答える
0

mutableconst暗黙のオブジェクトパラメータの修飾が無効になる効果があります( 5.2.5クラスメンバーアクセス[expr.ref]、段落4):

[...]E2がメンバーであると宣言されている場合mutable、のタイプE1.E2 は「<em>vq12 T」です。E2がメンバーとして宣言されていない場合mutable、のタイプE1.E2は「<em>cq12vq12 T」です。

5.2.5は、9.3.1p3に従って暗黙的なメンバーアクセスに適用されます。

id-expression [...]がクラスX[...]のメンバーで使用される場合、 id- expressionは、演算子の左側の接尾辞式(*this)として使用するクラスメンバーアクセス式に変換されます。.

したがって、あなたのconstメソッドでは、mutableメンバーはconst-qualifiedではありません(観察されます)。観察された動作は、コンパイラのバグの結果である必要があります。

于 2012-10-31T16:35:52.067 に答える