如何进行资格转换?

时间:2011-12-08 03:15:38

标签: c++ pointers const

我有一个例子:

int i = 1;
const int *b = &i;

在这种情况下,我不明白的是, 当i的地址转换为指向const int的指针时。 i是否在资格转换中转换为常量?当应用资格转换时,究竟在幕后发生了什么?

2 个答案:

答案 0 :(得分:6)

引擎盖下没有任何事情发生。 const是严格编译时实体。编译器仅使用const的知识来确定语句是否是错误而不是用于生成代码。因此如下:

int i = 1;
const int *b = &i;

相当于

int i = 1;
int *b = &i;

根据生成的代码。但是,如果您执行以下操作:

int i = 1;
const int *b = &i;
*b = 1;

编译器会注意到bconst(虽然它不知道i)并且会出错。但是,任何不被视为添加了const的错误的语句都会生成相同的代码,包括或不包含const。

答案 1 :(得分:1)

  

i的地址被转换为指向const int的指针

即可。 &i仍然是int(不是const int)的地址。引擎盖int*隐式转换为const int*。因此*b不可修改,但i仍然可以修改。

另外,请以不同的方式思考:如果您的假设是真的,那么以下将给出编译器错误,但它不会:

int i = 1;
const int *b = &i;
int *c = &i; // perfectly valid !