【问题标题】:auto and brace initialization in C++11/C++14 [duplicate]C ++ 11 / C ++ 14中的自动和大括号初始化[重复]
【发布时间】:2015-07-09 06:54:47
【问题描述】:

当我用 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&lt;int&gt;

为什么T = int 在 gcc 5.1 中?

【问题讨论】:

  • 如果我没记错的话,这个区域的 C++11 和 C++14 之间的规范有一个变化(甚至可能是后期的变化)——我会试着找到一个链接为它。
  • 值得注意的是,clang3.6 中的 C++14 支持绝对“不完整”,我希望这同样适用于 gcc 4.9 - 也可能是 5.0。因此,如果它是“规范中的后期”或只是“尚未实现的东西”,它很可能会在新版本中发生变化。

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


【解决方案1】:

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

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

auto var1 {2} ;

这里,var1 将被推导出为int

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

answer here 有更多关于提案历史和提出的缺陷的详细信息。

【讨论】:

  • 自上周(7 月 2 日)起,clang 仍将其视为initializer_list - 并警告“初始化推导类型的变量应使用 = 进行赋值”。
  • Clang 警告“auto{expr} 的含义将在未来的版本中改变”,大概是我们一直期望的行为”
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2020-02-08
  • 1970-01-01
  • 2013-03-16
  • 2018-05-09
相关资源
最近更新 更多