我知道,给定一个大括号初始值设定项,auto
将推导出一个 类型std::initializer_list
,而模板类型推导将失败:
auto var = { 1, 2, 3 }; // type deduced as std::initializer_list<int>
template<class T> void f(T parameter);
f({ 1, 2, 3 }); // doesn't compile; type deduction fails
我什至知道这在 C++11 标准中是在哪里指定的:14.8.2.5/5 bullet 5:
[如果程序有,这是一个非推导上下文] 一个函数参数,其关联参数是一个初始化列表 (8.5.4),但该参数没有 std::initializer_list 或对可能有 cv 限定的 std::initializer_list 的引用类型。[示例:
模板无效 g(T);
g({1,2,3}); // 错误:没有为 T 推导出参数
—<em>结束示例]
我不知道或不理解的是为什么存在这种类型推断行为的差异。C++14 CD 中的规范与 C++11 中的规范相同,因此标准化委员会可能不会将 C++11 行为视为缺陷。
有谁知道为什么auto
要为大括号初始化器推导出一个类型,但不允许模板这样做?虽然“这可能是原因”形式的推测性解释很有趣,但我对那些知道标准为何如此编写的人的解释特别感兴趣。