2011-02-08 39 views
4

它实际上是地狱。有人可以用简单的英语解释为什么以下部分工作或没有?C++返回类型限定词heaven

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

你说的这个'Fair'是什么意思? – 2011-02-08 13:48:43

回答

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; 

相同的初始化是不合法的非const引用。

您正试图用const表达式初始化引用。 Const表达式是右值。 const引用可以用rvalue初始化,而非const不能。

编辑:关于您可以在weakipedia中阅读的右值和左值。