C ++ возвращаемый тип квалификаторов рай - PullRequest
4 голосов
/ 08 февраля 2011

Это на самом деле ад.Может кто-нибудь объяснить на простом английском языке, почему следующие сегменты работают или нет?

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 ]

8 голосов
/ 08 февраля 2011

Вы не можете добавить 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
1 голос
/ 08 февраля 2011

Константная ссылка может быть инициализирована для объекта другого типа или для r-значения, такого как константное выражение:

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

Те же инициализации недопустимы для неконстантных ссылок.

Вы пытаетесь инициализировать ссылку с помощью выражения const. Const выражение - это значение. Ссылка на const может быть инициализирована с помощью значения rvalue, а не const - нет.

Редактировать : О значениях и значениях вы можете прочитать в weakipedia .

0 голосов
/ 08 февраля 2011

Компилятор не видит "Hey *" и "const Hey *" как одно и то же, поэтому он не хочет преобразовывать ссылку, тогда как он преобразовывает ссылку const (аналогично преобразованию параметра)

...