考虑以下程序:
#include <iostream>
int main()
{
int n = 3;
int fact = 1;
for(auto i{1};i<=n;i++)
fact*=i;
std::cout<<"fact of "<<n<<" is "<<fact;
}
-std=c++14
即使我使用选项,它也可以在 ideone 上正常编译。在此处查看现场演示。但在 C++14 中,变量i
应该initializer_list
根据this推导出来。
有一个针对 C++1z 的提议,它为大括号初始化实现了新的类型推导规则:
对于直接列表初始化:
对于只有一个元素的花括号初始化列表,自动推导将从该条目中推导出;
对于具有多个元素的支撑初始化列表,自动推导将是不正确的。
[例子:
自动 x1 = { 1, 2 }; // decltype(x1) 是 std::initializer_list
自动 x2 = { 1, 2.0 }; // 错误:无法推断元素类型
自动 x3{ 1, 2 }; // 错误:不是单个元素
自动 x4 = { 3 }; // decltype(x4) 是 std::initializer_list
自动 x5{ 3 }; // decltype(x5) 是 int。
--结束示例]
因此,规则在 C++17 中发生了变化。因此,当我使用-std=c++14
. 这是g ++中的错误吗?不应该像C++14 中i
那样推导出变量吗?initializer_list