为什么自动 i = same_const_variable 无法推断出"const"?
why auto i = same_const_variable could not deduce "const"?
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
,而模板参数演绎不会这样做。
, §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不是价值的一部分。int
是int
,无论它是使用文字、命名常量、表达式还是非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 auto
或const 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 &
类型,否则将允许非法修改。
- '尝试解析可变参数模板时无法推断出'T的模板参数
- "auto"推断出 hashtable_policy.h 中的错误类型
- GCC7 在同一类中推断出常量修饰符的存在
- 三元运算符 '?:' 在 4.9.0 之前的 GCC 版本中推断出不正确的类型?
- 为什么"return (str);"推断出与C++中的"return str;"不同的类型?
- 为什么自动说明符从 &指针推断出"顶部和低"级别的常量?
- 为什么编译器不能从返回类型中推断出模板参数?
- std::sort / 适用于测试代码,但无法推断出模板
- 无法从'int'中推断出'Node<T> *'的模板参数
- 完美的转发功能推断出冲突错误
- 从第一类型的第二个非类型参数中推断出第一类
- 是否可以推断出模板功能中的参数类型
- 无法从'std::string'中推断出'const std::reverse_iterator<_RanIt> &'的模板参数
- std::forward 如何推断出"_Ty"的类型?
- 如何允许编译器推断出正确的返回类型以进行模板get函数
- 自动无法推断出正确的返回类型
- 既然C++知道类型,它能推断出点和箭头吗?
- 如何使模板化运算符推断出正确的返回类型
- 无法推断出'const'的模板参数...从 int
- 为什么自动 i = same_const_variable 无法推断出"const"?