【问题标题】:In C++, if "int a = 3; int* p = &a;", then why is "const int* &pp = p" not allowed, but "const int* const &pp = p" is allowed?在 C++ 中,如果“int a = 3; int* p = &a;”,那么为什么不允许“const int* &pp = p”,而允许“const int* const &pp = p”?
【发布时间】:2018-09-10 03:10:34
【问题描述】:

在 C++ 中,如果:

int a = 3; 
int* p = &a; 

那为什么是

const int* &pp = p; 

不允许,但是

const int* const &pp = p; 

允许吗?

【问题讨论】:

    标签: c++ c++11 reference constants


    【解决方案1】:

    给定const int* &pp = p;,首先必须将p 隐式转换为const int*。但是转换后的const int* 是临时的,不能绑定到非const 的左值引用(如const int* &)。

    Temporary 可以绑定到 const 的左值引用(如const int* const &)(和右值引用),所以const int* const &pp = p; 可以正常工作。并且临时的生命周期延长到引用pp的生命周期。

    【讨论】:

      【解决方案2】:

      当 * 左边的 const 修饰符指向 dest,当 * 右边的 const 修饰符指向 const 修饰符,而你的疑问,local var 的 addr 应该是 const。

      【讨论】:

        【解决方案3】:

        不允许第一次转换的原因是它(微妙且不直观)破坏了 const 正确性。有一个讨论here。简而言之,问题是这样的:

        const int x;
        int* p;
        const int** q = &p;
        *q = &x;
        *p = 3;
        

        如果第三行有效,第四行将设置p 指向x(因为*q 是p),所以*p = 3 将修改x,即使x是const。

        当顶级修饰符是引用而不是指针时,也会出现同样的问题。

        在多层指针类型中修改const 限定符时,您必须孤注一掷。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-16
          • 1970-01-01
          • 2010-11-02
          • 2017-03-18
          • 1970-01-01
          • 2018-11-29
          • 2010-11-30
          相关资源
          最近更新 更多