麻烦:'const int * const & alias_for_ptr = ptr;',为啥两个标识符有不同的值?
Posted
技术标签:
【中文标题】麻烦:\'const int * const & alias_for_ptr = ptr;\',为啥两个标识符有不同的值?【英文标题】:Trouble with: 'const int * const & alias_for_ptr = ptr;', why do both identifiers have different values?麻烦:'const int * const & alias_for_ptr = ptr;',为什么两个标识符有不同的值? 【发布时间】:2010-12-19 09:01:53 【问题描述】:我无法理解const int* const &alias_for_ptr = ptr;
的含义
关于以下几点:
#include <iostream>
using namespace std;
int main()
int a = 10;
int* ptr = &a;
const int* const &alias_for_ptr = ptr;
ptr = NULL; //or ptr = 0;
if (ptr == alias_for_ptr)
//This should execute but doesn't
cout << "ptr == alias_for_ptr" << endl;
else
//This should NOT execute but DOES
cout << "ptr != alias_for_ptr" << endl;
return 0;
为什么ptr == alias_for_ptr
返回false,(实际上alias_for_ptr
保留了它的旧值&a
)?我的印象是alias_for_ptr
将始终具有与ptr
相同的值(尽管使用了& 符号),并且const int* const X = Y
仅确保我不能同时更改X
的值和指向的值通过 X
通过标识符 X
。
此外,如果我删除第二个const
,那么脚本将无法编译,这让我更加困惑。注意编译错误是:invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’
.
【问题讨论】:
【参考方案1】:您使用的是哪个编译器?我是在 MSVC++ 2010 下编译的,效果如你所愿。
我认为正在发生的事情是临时分配给 const 引用,因为“ptr”的类型从“int*”转换为“const int*”。如果删除第一个 const 会发生什么?
编辑:阅读此处了解更多关于参考的信息:Reference initialization in C++。
【讨论】:
我认为你是对的。我正在使用 g++,如果我删除了第一个 const,那么它会按预期工作,如果我在上面的行中添加一个 const 以便它的const int* ptr = &a;
那么它也可以工作。有没有办法不添加/删除这两个常量?我试过使用 const_cast
运算符,但没有运气。可能是 g++ 的一个错误。以上是关于麻烦:'const int * const & alias_for_ptr = ptr;',为啥两个标识符有不同的值?的主要内容,如果未能解决你的问题,请参考以下文章
int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的差别
C++学习笔记关于const int* int const * int* const
the difference between const int *, int * const, int const *
以下关于指针的说法,正确的是( ) A.int *const p与int const *p等价 B.const int *p与int *const p等价 C.const int *p与int c