当我用clang编译下面的代码时,gcc T
的推断方式不同。
#include<initializer_list> //for clang
//to see how T is deduced(form compiler error).
template<typename T>
void foo(T);
int main() {
auto var1{2};
foo(var1);
}
这是我得到的。
clang 3.6(c++11/c++14)
gcc 4.9(c++11/c++14)
T = std::initializer_list<int>
gcc 5.1(c++11/c++14)
T = int
我认为T
应为std::initializer_list<int>
。
为什么{1}}在gcc 5.1中?
答案 0 :(得分:5)
这是对C ++ 17规范的建议更改 - N3922(我不确定它是否已被接受)。
基本上这个presentation from Scott Meyers,幻灯片20涵盖了新规则。
auto var1 {2} ;
此处,var1
将被推断为int
。
看起来好像有些编译器已经实现了这一改变。我相信这种变化更“直观”,但你的里程可能会有所不同。我认为在这个临时阶段,更喜欢=
初始化,它可能更便携。
answer here更详细地介绍了提案的历史和提出的缺陷。