2012-04-25 14 views
0
struct A { 
    int &r; 
    A (int &i) : r(i) {} 
    void foo() const { 
    r = 5; // <--- ok 
    } 
}; 

コンパイラはr = 5;にエラーを生成しません。
&rがすでにであることを意味しますか?const-correctは参考になります(論理的にはint* const)。 [ここにはrelatedの質問が1つあります]クラスメンバ参照変数には組み込みの "const-correctness"がありますか?

+0

const正確さが '* this'に適用され、メンバではないので、参照されたオブジェクトだけを変更したが、参照自体は変更していないからだ。ポインターの場合と同様に注意してください。 – RedX

+0

@Justin:うん。そのコンストラクタはA(int&i)でなければなりません。 –

+0

...組み込みのconst-incorrectnessと似ていますが、それはあなたが尋ねる人によって異なります... –

答えて

4

私はあなたが「すでにCONST-正しい」の意味を正確にわからないんだけど、:rに割り当て

Aのコンストラクタに渡されたどんなものに割り当てることと同じです。 Aのインスタンスで何も変更していないので、fooがconstとして宣言されているということは障害ではありません。

struct A { 
    int * r; 
    A (int * i) : r(i) {} 
    void foo() const { *r = 5; } 
} 

fooがconstのであるという事実は、それが上と呼ばれていますAインスタンスには何も変更しないことを意味します。あなたはこれを行うだろうかのように、それは非常に多くのです。これと、それが供給された他のデータを変更することとの間に矛盾はありません。もちろん

あなたがAの一部のメンバーを参照することrの手配に起こったならば、fooを呼び出すと、すべての後にAのインスタンスを変更します。コンパイラは、メンバ関数のいずれかが違反される可能性のあるすべての可能な方法をキャッチすることはできません。メンバー関数を宣言するときには、それはそのような暗黙のうちに関与しないと約束しています。const

1

はい、論理的にはint* constです。

rの参照への望ましくない変更を防ぐために、この場合適切に修飾されたアクセサーを作成して使用することができます。

1

constメンバー関数は、暗黙的に、このような修飾子を持たないすべてのデータメンバーの左側に暗黙的に挿入して解釈します。そのconstは既に暗黙のうちに参照のためにあります(int & const r;は不正な構文です)。言い換えれば、参照は "const-correct"です。あなたの命名法を使用します。

メンバ関数のconst修飾子は、すべてのデータメンバ(例えば、データメンバconstメンバ関数でint const * const * const foo;ようint ** foo;行為)のために可能なすべての有効な位置、それISNでconstを挿入するのに影響していた場合、それはいいだろう何が起きているのか、それは標準が何が起こるかということではありません。

関連する問題