C ++返回类型限定符天堂

时间:2011-02-08 13:44:40

标签: c++ visual-c++ return-type qualifiers

实际上,这真是太棒了。有人可以用简单的英语解释为什么以下部分有效吗?

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 :(得分: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

答案 1 :(得分:1)

const引用可以初始化为不同类型的对象或rvalue,例如常量表达式:

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

对于nonconst引用,相同的初始化是不合法的。

您正尝试使用const表达式初始化引用。 Const表达式是rvalue。 const引用可以用rvalue初始化,而非const则不能。

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

答案 2 :(得分:0)

编译器没有看到“Hey *”和“const Hey *”相同所以它不想转换引用,而他转换const引用(类似于参数转换)