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

7

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

为什么在gcc 5.1中T = int


如果我记得没错的话,在C++11和C++14之间在这个领域发生了一些变化(甚至可能是晚期的变化)-我会尝试找到相关链接。 - Niall
值得注意的是,clang3.6中的C++14支持“并不完整”,我预计gcc 4.9 - 可能也包括5.0 - 也是如此。因此,如果它是“规范中的某些较晚实现”或者只是“尚未有人实现的某些东西”,那么它很可能会在新版本中发生变化。 - Mats Petersson
1个回答

8
这是对 C++17 规范的建议更改 - N3922(我不确定它是否已被接受)。
基本上,Scott Meyers 的演示文稿,第 20 页涵盖了新的规则。
auto var1 {2} ;

在这里,var1将被推断为一个int

看起来有些编译器已经实现了这个变化。我认为这个变化更加“直观”,但是你的体验可能会有所不同。我认为在这个过渡期中,最好使用=初始化,这样可能更具可移植性。

这里的答案提供了更多关于提案和缺陷历史的细节。


3
而 clang 在上周(7月2日)仍将其视为“initializer_list”——并发出警告:“使用推断类型初始化变量应使用=进行赋值”。 - Mats Petersson
Clang警告说,“auto{expr}的含义将在未来版本中更改”,这可能是我们一直期望的行为。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接