为什么自动 i = same_const_variable 无法推断出"const"?

why auto i = same_const_variable could not deduce "const"?

本文关键字:const 推断出 variable same 为什么      更新时间:2023-10-16
const int ci = 10;
auto i = ci;  // i will be "int" instead of "const int"
i = 20;

我想知道为什么auto是为这种行为设计的?

为什么类型I是"int"而不是"const int"?

这里有什么问题?

我想理解为什么会帮助我们记住它

auto大多遵循与模板参数推导相同的类型推导规则。唯一的区别是auto在某些情况下会从带括号的初始化列表中推断出std::initializer_list,而模板参数演绎不会这样做。

从N3337

, §7.1.6.4 [dcl.spec.auto]

6,,…为变量d推导出的类型为使用从函数调用(14.8.2.1)中推导模板实参的规则确定的推导出的A,…

你观察到的行为与从函数调用

推导类型时模板参数推导所做的相同。

§14.8.2.1 [temp.deduct.call]

如果P不是引用类型:
,,, -…
     -如果A是cv限定类型, A类型的顶级cv限定符将被忽略,用于类型推导
因此,在 中
auto i = ci;

忽略顶级const限定符,将i推导为int

auto& i = ci;

i不再不是引用类型,上述规则不适用,因此保留const限定符。

auto本身意味着您需要一个具有给定值副本的新的本地所有变量。const -ness不是价值的一部分。intint,无论它是使用文字、命名常量、表达式还是非const变量来指定。

auto i = 3,
     j = i,
     k = ci,
     m = 3 + 4; // All these variables are type int.

要获得演绎类型的常量,您仍然可以使用auto const。这在声明中表达了如何使用变量。

const auto i = 3;

从c++ 14开始,还有decltype(auto)说明符,它将decltype应用于初始化式,以生成给定变量的副本。也许这就是你所期望的:

decltype(auto) i = ci; // i receives type const int.

现场演示。

decltype(auto)有点棘手,但是,除了决定函数调用包装器的返回类型的原始目的之外,它几乎没有用例。除非有很好的理由,否则请选择const autoconst int

另一种选择是使用转发引用,拼写为auto &&。它指的是初始化它的变量或值,不管它是什么。
auto && i = ci; // i receives type const int & and aliases ci.

这样表达性较差,也不具体,但是可靠地将i声明为ci的别名。您尝试的另一件事是auto &,它类似,但只允许形成对预先存在的变量的引用。

auto & i = ci; // i receives type const int & and aliases ci.
const int变量的引用必须是const int &类型,否则将允许非法修改。