C ++ 11 / C ++中的自动和大括号初始化14

时间:2015-07-09 06:54:47

标签: c++ c++11 gcc clang c++14

当我用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中?

1 个答案:

答案 0 :(得分:5)

这是对C ++ 17规范的建议更改 - N3922(我不确定它是否已被接受)。

基本上这个presentation from Scott Meyers,幻灯片20涵盖了新规则。

auto var1 {2} ;

此处,var1将被推断为int

看起来好像有些编译器已经实现了这一改变。我相信这种变化更“直观”,但你的里程可能会有所不同。我认为在这个临时阶段,更喜欢=初始化,它可能更便携。

answer here更详细地介绍了提案的历史和提出的缺陷。