auto 类型说明符忽略*** const

Posted

技术标签:

【中文标题】auto 类型说明符忽略*** const【英文标题】:auto type specifier ignores top-level const 【发布时间】:2020-10-14 09:48:25 【问题描述】:

我在阅读 Lippman 等人的“C++ Primer”时偶然发现了这个问题。 (5/e)

 14     int i = 0;
 15     const int ci = i, &cr = ci;
 16     auto c = cr;
 17
 18     c = 12; // works fine

我们有这个代码 sn-p。

在第 15 行 const on ci 是***的,const on cr 是(一如既往在引用上)是低级的。

页。这本书的69说,

"auto 通常会忽略***常量"

但它忽略了cr 上的低级const,因为c 的类型为int(c 的值可以更改为12 而不会编译器抱怨)。 而我希望 c 属于 const int 类型,因为 cr 上有一个低级 const

请帮助我理解这一点。

【问题讨论】:

【参考方案1】:

考虑顶层,因为它与auto 变量的结果类型相关。如果它是const int,它将改为int

如果它是const int* const,它将改为const int*

【讨论】:

【参考方案2】:

简单来说,***const 是应用于对象本身的那个。 int * const 不是const,它是指向const 的非常量指针,而const int * const 中的***const 使对象本身成为const

这些规则旨在有用。删除最上面的const 使auto 适用于此类常见情况:

const int x = 5;
auto y = x;
++y;

通常 C++ 默认为非常量。当您想将y 声明为const 时,您需要指定它。

【讨论】:

以上是关于auto 类型说明符忽略*** const的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer阅读笔记:const | constexpr | 类型别名 |auto

C++ Primer阅读笔记:const | constexpr | 类型别名 |auto

C++学习:Effective Modern C++条款

C++学习:Effective Modern C++条款

C++学习:Effective Modern C++条款

c++学习笔记2--constexpr,类型别名,auto