2011-02-08 11 views
4

実際に地獄です。誰かが以下のセグメントがうまくいかない理由を簡単に説明できますか?C++リターン型修飾子天国

class Hey; 

class Bitmap { 

public: 
    const Hey* const& getHey() { return hey; }; // works 
    const Hey* & getHey2() { return hey; }; // error C2440: 'return' : cannot convert from 'Hey *' to 'const Hey *&' 

private: 
    Hey* hey; 
}; 
+3

あなたが話すこの「公平」とは何ですか? –

+0

何がフェアですか?ねえ? – Lundin

+2

シンプルな 'const Hey *'を返すと何が問題になるのですか?何を参照する必要がありますか? – trojanfoe

答えて

8

、あなたは非constポインタにconst変数のアドレスを詰める可能性があるためあなたは、ポインタにconstそのものではない複数のタイプの深いをconstを追加することはできません。検討してください:

char c; 
char* p = &c; 
const char* cp = p; // ok, only one type deep 
const char x; 
cp = &x; // ok 
const char*& r = p; // fail, because... 
r = cp; // ok 
*p = 5; // ok, would overwrite a const variable if binding r to p were allowed 

ポインタを作成すると、この災害は別の方法で防げます。例を続けると:それは彼が、パラメータに似const参照を(変換するのに対し、参照を変換したくないので

const char* const& cr = p; // ok 
cr = cp; // fail, cr is const, saving us from... 
*p = 5; // would overwrite a const variable if cr = cp were allowed 
0

コンパイラは、同じように、「ねえ*」と「CONSTねえ*」を参照しません。変換)

1

const参照は、定数式として、異なるタイプのオブジェクトまたは右辺値に初期化することができる。

const int i = 42; 
    // legal for const references only 
    const int &r = i; 

同じ初期化がnonconst参照の法的ありません。

const式で参照を初期化しようとしています。 Const式はrvalueです。 const参照はrvalueで初期化できますが、非constでは初期化できません。

:右値と左値についてはweakipediaで読むことができます。