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

Pra*_*een 5 c++ gcc clang c++11 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);
}
Run Code Online (Sandbox Code Playgroud)

这就是我得到的.

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
Run Code Online (Sandbox Code Playgroud)

我认为T应该是std::initializer_list<int>.

为什么T = int在gcc 5.1?

Nia*_*all 6

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

基本上来自Scott Meyers的演示文稿,幻灯片20涵盖了新规则.

auto var1 {2} ;
Run Code Online (Sandbox Code Playgroud)

在这里,var1将被推断为int.

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

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

  • 截至上周(7月2日),clang仍将其视为"initializer_list" - 并警告"已推断类型的变量的初始化应使用=进行分配". (3认同)