2016-07-01 10 views
2

constメソッド内のrefメンバから非constメソッドを呼び出せるのはなぜですか? m_aが参照型でない場合のように、コンパイルエラーが発生することが予想されます。 http://cpp.sh/C++なぜconstメソッド内のrefメンバから非constメソッドを呼び出すとコンパイルエラーが発生しない

// Example program 
#include <iostream> 

class A 
{ 
    public: 
    void nonConstMethodOfA() 
    { 
     std::cout << "nonConstMethodOfA is called" << "!\n"; 
    } 
}; 

class B 
{ 
    public: 
    B(A& a) 
    : m_a(a) 
    { 
     constMethodOfB(); 
    } 

    private: 
    A& m_a; 
    void constMethodOfB() const 
    { 
     m_a.nonConstMethodOfA(); 
    } 
}; 

int main() 
{ 
    A varA; 
    B varB(varA); 
} 
+3

@juanchopanza:私は多分Dのように(私は本当にDを知らないが、私はアンドレイ・A.がDで推移const性に働いていたことを知っている)、OPは '推移としてconst'を想定していると思います。 –

+0

@juanchopanza m_aが参照型でない場合のようにコンパイルエラーが発生することが予想されます。 –

+0

@juanchopanza完了。 –

答えて

2

const A &手段 "CONST Aを参照し、"

A &手段 "可変Aを参照し、"

参照のでA &も暗黙的に「可変にconst参照を意味し、再割り当てすることができませんA "である。

+0

実際に私はOPと同じ期待を持っていました。私は「A」自体は何とか「const」だと理解していますが、まだ私はちょっと混乱しています。非constオブジェクトBへの参照メンバを持つことはできません。そのため、参照を通して、Aの 'const'メソッドでBを(参照によって)変更することはできません。 – user463035818

+1

プロポーザルに[propagate_const'](http://en.cppreference.com/w/cpp/experimental/propagate_const)があります。 C++ 17と 'operator dot'オーバーロードの後、同様の参照ラッパーを書くことができます。 –

1

のconstメンバ関数の 実行は、あなたのthisfn()がconstのであればこれthis->fn()にのみ呼び出すことができ、constオブジェクトを指すことを意味します。これは、型、または同様の型指定の入力パラメータまたはグローバルをロックしません。ただし、必要に応じてconstとして指定することもできます。

+0

"[...]メンバをロックしない"私は分かりません。 Isnt 'struct {int a; void foo()const {a ++; } '間違っている、' a'を突然変異させようとしているから? – user463035818

+0

@ tobi303はい、それはOPのコードがやっていることではありません。メンバvar 'm_a'は、具体的なオブジェクトへの参照であり、具体的なオブジェクトの*インスタンス*ではありません。参考として、それは暗黙のうちに不変の後の初期化です(私はあなたがすでに理解していると思います)ので、何も 'm_a'メンバを変更しません。私は乾杯に同意する。 OPは非const参照メンバを介して 'const'が推移的であることをOPが期待していたように見えますが、そうではありません(まだC++ 17が潜在的です)。 – WhozCraig

+0

@WhozCraigはい、でも私はこの答えが誤解を招くことがあります。これを読んで、上記の例がうまくいくと思います。 'struct {int & a; void foo()const {a ++; } '私が理解しているように、メンバ自体' a'は 'foo'の' const'です(しかし 'const'を参照するオブジェクトを作ることはありません)。 「this」の定数はメンバーの恒常性を意味します(ただし、メンバーが参照または指し示しているものはありません) – user463035818

関連する問題