Error C2664: cannot convert from non const T* to const T*&

编写程序时遇到以下错误:

Error C2664: cannot convert from non const T* to const T*&

错误原因如下:


Q1:

The following code generates an incorrect compile error:


int* p;
int const* & r = p; // reference to a pointer to const int

error C2440: 'initializing' : cannot convert from 'int *' to 'const int *&'

     Conversion loses qualifiers


A1:

The error is correct. Due to the added layer of indirection, it is not safe to reference a pointer to an int through a pointer to a const int. Consider what could happen if it were allowed:

----------

int *p;
const int *&r = p;    // reference to a pointer to const int
const int immutable = 0;
r = &immutable;    // assign p to address of immutable
*p = 1;    // whoops, now 0 = 1!

----------


Q2:
#include
using namespace std;
int f(int i)
{ return ++i;
}
int g(int & i)
{ return ++i;
}
int main()
{ int a=0,b=0;
 a+=g(g(a));
 a+=g(f(b));
 cout<<"a="<A2:

所谓引用,其实就是别名,一但起名后就不能改了,所有的行为跟原变量完全一样。类型当然要相同。
所以,一个非const的引用,其实指的是它引用的对像是non-const的。
你这裏犯的错误等於把一个const转为非const了。这是不允许的。

为什麼一个函数的返回值是const呢?因为函数返回值是放在栈上的,用完就回收,它的有效期只有包函它的语句为止。所以它只是个临时变量,编译器当然会认为他是不能修改的。

常数,常量,变量的值,都是const的。为了返回一个左值,你可以
int& f(int& i)
{ return i;
} 
这样,f(i)就等同於i。f(i)++等同於i++。
但最好不要
int& f(int i)
{ return ++i;
} 
犯了和返回临时变量的指针一样的错误。

你可能感兴趣的:(C/C++,fundamentals)