我正在阅读 Scott Meyers 的《Effective Modern C++》。第 1 项包含以下示例:
template<typename T>
void f(T& param); // param is a reference
int x = 27; // x is an int
const int cx = x; // cx is a const int
f(cx); // T is const int,
// param's type is const int&
第 3 项中出现以下示例:
Widget w;
const Widget& cw = w;
auto myWidget1 = cw; // auto type deduction:
// myWidget1's type is Widget
根据我预期的第 1 项myWidget1
的类型为const Widget
。我错过了什么吗?
在多数情况下auto
遵循模板参数推导规则:
§ 7.1.6.4 [dcl.spec.auto]/p6:
一旦类型a声明符 ID已经根据8.3确定了声明变量的类型
使用声明符 ID使用模板参数的规则从其初始值设定项的类型确定
扣除。让T
是为变量标识符确定的类型d
。获得P
from T
经过
替换出现的auto
使用新发明的类型模板参数U
或者,如果初始化程序
是一个大括号初始化列表(8.5.4),其中std::initializer_list<U>
。为变量推导的类型d
那么推导出来的就是A
使用函数调用中的模板参数推导规则确定 (14.8.2.1)。
§ 14.8.2.1 [temp.deduct.call]/p2:
If P
不是引用类型:
如果你想myWidget1
成为类型const Widget&
,它应该声明为引用类型,例如:
auto& myWidget1 = cw;
// ^
DEMO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)