在C++ primer 5中,我看到了以下代码:
const int a = 40;
auto &b = a;编译器可以推导出类型为:const int &的b。
我认为这是合理的,因为a是一个const int,如果b有int &类型,我们可以改变const int的值,这是非法的。
然而,书中说,自动推导将省略顶层常量,与此规则,在代码中:auto &b = a; a只有类型int,我们可以推迟b有类型int &,这与b有类型const int &冲突。
另一个问题是代码:
auto &a = 8;编译器不能在代码中直接推断出具有类型const int &:
const int a = 40;
auto &b = a;编译器可以。为什么会有不同?
发布于 2017-02-17 02:23:12
auto演绎,除了一些小的例外,与普通模板演绎的工作方式完全相同。假设我们有一个函数:
template <class T> void foo(T& param);
const int a = 40;
foo(a);在本例中,T将推导为const int,param的类型将为const int&。根据同样的推理,auto& b = a;为您提供了对const int的引用。
但是,foo(8)不会编译。T&只能绑定到左值,而8不是左值。所以这是病态的。同样,auto& a = 8;也是病态的。
https://stackoverflow.com/questions/42281699
复制相似问题