【发布时间】:2013-07-09 02:13:30
【问题描述】:
我知道,给定一个大括号初始化器,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 的引用 类型。 [ 例子:
模板 void g(T);
g({1,2,3}); // 错误:没有为 T 推导出参数
—结束示例 ]
我不知道或不明白的是为什么存在这种类型推导行为的差异。 C++14 CD 中的规范与 C++11 中的规范相同,因此标准化委员会可能不会将 C++11 行为视为缺陷。
有谁知道为什么auto 为花括号初始化器推导出一个类型,但不允许模板这样做?虽然“这可能是原因”形式的推测性解释很有趣,但我对那些知道标准为何如此编写的人的解释特别感兴趣。
【问题讨论】:
-
最近有人问了另一个关于你发现了什么的问题。它可能有一些原因。
-
好的,找到了。唯一真正的为什么讨论是一条评论,但你可以看看:stackoverflow.com/questions/17496268/…
-
引自Scott Meyers:“我不知道为什么
auto和模板的类型推导不一样。如果你知道,请告诉我!”。
标签: c++ c++11 templates template-argument-deduction list-initialization