c++ 11/ c++ 14中的auto和大括号初始化

auto and brace initialization in C++11/C++14

本文关键字:c++ 初始化 auto 中的      更新时间:2023-10-16

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

为什么T = int在gcc 5.1?

这是对c++ 17规范N3922的提议变更(我不确定它是否已被接受)。

基本上这是Scott Meyers的演讲,幻灯片20涵盖了新规则。

auto var1 {2} ;

这里,var1将被演绎为int

看起来一些编译器已经实现了这个改变。我相信这种改变更"直观",但你的情况可能会有所不同。我认为在这个过渡阶段,更喜欢=初始化,它可能更可移植。

这里的答案更详细地介绍了提出的建议和缺陷的历史。