2011-02-08 2 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

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

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

Той же инициализация не законна для nonconst ссылок.

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

Редактировать: О rvalues ​​и lvalues ​​вы можете прочитать в weakipedia.