C++11/C++14 中的自动和大括号初始化
auto and brace initialization in 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);
}
这是我得到的。
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(我不确定它是否已被接受)。
基本上这个 presentation from Scott Meyers,幻灯片 20 涵盖了新规则。
auto var1 {2} ;
在这里,var1
将被推断为 int
。
看起来某些编译器确实已经实施了更改。我相信变化更多 "intuitive" 但您的里程可能会有所不同。我认为在这个过渡阶段,更喜欢 =
初始化,它可能更便携。
answer here 更详细地介绍了提议和提出的缺陷的历史。
当我用 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(我不确定它是否已被接受)。
基本上这个 presentation from Scott Meyers,幻灯片 20 涵盖了新规则。
auto var1 {2} ;
在这里,var1
将被推断为 int
。
看起来某些编译器确实已经实施了更改。我相信变化更多 "intuitive" 但您的里程可能会有所不同。我认为在这个过渡阶段,更喜欢 =
初始化,它可能更便携。
answer here 更详细地介绍了提议和提出的缺陷的历史。