【问题标题】:address of a const object interpreted as low level const解释为低级 const 的 const 对象的地址
【发布时间】:2020-07-12 07:51:18
【问题描述】:

在 C++ Primer(第 5 版)中,我发现了一个对我来说没有多大意义的示例:

const int i = /*some integer literal*/;

auto e = &i; 

对我来说,&i 代表const int i 的地址——所以地址本身不是(低/高级)常量,e 应该被解释为int *

但这本书将e解释为const int*说明原因(const对象的&是低级const) - 有人可以澄清什么是错的以我的理解。

【问题讨论】:

  • const int* 表示整数是 const (这是正确的)。 int* const 表示指针是 const (如您所说,这不是真的)。所以我认为你只是误解了const int* 的含义。
  • e 不是常量。你可以修改它。要 const 限定它,类型需要是 int * const
  • 这里一切都清楚了:const int* 是指向 const 整数的非 const 指针,int* const 是指向非 const 整数的 const 指针,const int* const 是指向 const 整数的 const 指针
  • @john 是的,这是一个错字 - 已修复 :)
  • @AgrudgeAmicus 是的,没错。如果eint*,那么你可以使用e 来修改i,这是不允许的,因为i 是const。

标签: c++ c++11 auto


【解决方案1】:

您使用auto 为e 分配地址,因此e 是一个指针。 const 适用于 int,e 指向 const int 但 e 不是 const 指针。 如果 e 不是 const 指针,则 e 将是顶级 const,e 是指向 const int 的非 const 指针(即您可以将其他地址分配给 e)。 因此 e 是一个低级 const

int i = /*some integer literal*/;

const auto e = &i; 

现在e 是一个指向非 const int 的 const 指针。由于对象本身e 是 const,因此这是一个顶级 const

【讨论】:

    【解决方案2】:

    摘自《C++ Primer 5th Edition》一书:

    ...,指针是一个可以指向不同对象的对象。作为一个 结果,我们可以独立讨论指针是否为 const 和 它可以指向的对象是否为常量。我们用这个词 顶级 const 表示指针本身是一个 const。当一个 指针可以指向一个 const 对象,我们将该 const 称为 低级常量。

    更一般地说,顶级 const 表示对象本身是 常量。顶级 const 可以出现在任何对象类型中,即 内置算术类型、类类型或指针类型。低级 const 出现在复合类型的基类型中,例如指针或 参考。请注意,与大多数其他类型不同,指针类型可以具有 顶级和低级 const 独立:

    int i = 0;
    int *const p1 = &i; // we can't change the value of p1; const is top-level
    const int ci = 42; // we cannot change ci; const is top-level
    const int *p2 = &ci; // we can change p2; const is low-level
    const int *const p3 = p2; // right-most const is top-level, left-most is not
    const int &r = ci; // const in reference types is always low-level
    

    希望它有助于更​​好地理解。

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 2015-07-02
      • 2019-12-12
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多