4

まさに地獄です。以下のセグメントが機能するかどうかを簡単な英語で説明してもらえますか?

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;
};
4

3 に答える 3

8

変数のアドレスを非ポインターに詰め込む可能性があるため、constそれ自体ではない複数のタイプの深さをポインターに追加することはできません。検討:constconstconst

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
于 2011-02-08T13:53:01.133 に答える
1

const 参照は、異なる型のオブジェクトまたは定数式などの右辺値に初期化できます。

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

同じ初期化は、非 const 参照には使用できません。

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

編集: weakipedia で読める右辺値と左辺値について

于 2011-02-08T14:08:07.443 に答える
0

コンパイラは "Hey*" と "const Hey*" を同じものとして認識しないため、参照を変換したくありませんが、const 参照を変換します (パラメータ変換と同様)。

于 2011-02-08T14:02:04.543 に答える