麻烦:'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 保留了它的旧值&amp;a)?我的印象是alias_for_ptr 将始终具有与ptr 相同的值(尽管使用了& 符号),并且const int* const X = Y 仅确保我不能同时更改X 的值和指向的值通过 X 通过标识符 X

此外,如果我删除第二个const,那么脚本将无法编译,这让我更加困惑。注意编译错误是:invalid initialization of reference of type ‘const int*&amp;’ from expression of type ‘int*’.

【问题讨论】:

【参考方案1】:

您使用的是哪个编译器?我是在 MSVC++ 2010 下编译的,效果如你所愿。

我认为正在发生的事情是临时分配给 const 引用,因为“ptr”的类型从“int*”转换为“const int*”。如果删除第一个 const 会发生什么?

编辑:阅读此处了解更多关于参考的信息:Reference initialization in C++。

【讨论】:

我认为你是对的。我正在使用 g++,如果我删除了第一个 const,那么它会按预期工作,如果我在上面的行中添加一个 const 以便它的 const int* ptr = &amp;a; 那么它也可以工作。有没有办法不添加/删除这两个常量?我试过使用 const_cast 运算符,但没有运气。可能是 g++ 的一个错误。

以上是关于麻烦:'const int * const & alias_for_ptr = ptr;',为啥两个标识符有不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

声明和定义,const,enum,头文件

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

const int *a和int *const a的区别