2017-02-26 10 views
-1

これはなぜコンパイルされますか?参照でC++ const lost

struct A {}; 
struct B { 
    B(A& _a) : a(_a) {} 
    A &a; 
}; 

void f1(A&) {} 
void f2(const B &b) { f1(b.a); } 

int main() { 
    A a; 
    B b{a}; 
    f2(b); 
    return 0; 
} 

f2()内はconstなので、私の理解ではb.aもconstでなければなりません。しかし、それはコンパイルし、コンパイラはf1()を呼び出すことができます。

'A & a;'を置き換えます。構造体Bで 'A a;'もはや機能しません。確かにb.a F1で今 は()constは次のとおりです。

invalid initialization of reference of type 'A&' from expression of type 'const A' 

私が...おかげでこれを理解するのに役立ちます。

答えて

5

オブジェクトがconstの場合、参照対象はオブジェクト自体の一部ではないため、constとなることはありません。参照メンバは、他のオブジェクトのアドレスを表す単なる情報です。 Bオブジェクト自体が不変であるかどうかは、それが参照するオブジェクトを変更することが可能かどうかに影響を与えてはなりません。

あなたはB::aメンバー非参照を行った場合、A a;のように、その後、Bオブジェクトは、実際に前者がconstあるときに、後者はあまりにもなり、自身の中にAオブジェクトが含まれています。

1

です。インスタンスがconstの場合はメンバーもなります。しかし、メンバーのタイプを見てください。

A & a; 

これはAへの参照です。定数Aへの参照

A & const a; 

ないconstAへの一定の基準を生み出すことを作ります。

+0

エラー: 'const'修飾子は 'A&'には適用できません – Jarek

+0

誰がそれを言っていますか? (どのような文脈で?)はい、完全に冗長です(https://isocpp.org/wiki/faq/const-correctness#const-ref-nonsense)。とにかく、思考実験としてもっと意味があった;) –

0

厳密に言えば、定数参照はありません。定数オブジェクトへの参照があります。クラスBでは

データメンバaは、タイプA

A &a; 

の非定数オブジェクトへの参照のように宣言され、この文献は参照を受け入れる関数への引数として渡されます。非定数オブジェクト

void f1(A&) {} 
void f2(const B &b) { f1(b.a); } 

したがって、コードは正常にコンパイルされます。

関連する問題