2

考虑以下程序:

#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 的提议,它为大括号初始化实现了新的类型推导规则:

对于直接列表初始化:

  1. 对于只有一个元素的花括号初始化列表,自动推导将从该条目中推导出;

  2. 对于具有多个元素的支撑初始化列表,自动推导将是不正确的。

[例子:

自动 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

4

1 回答 1

6

有一个针对 C++1z 的提案,它为大括号初始化实现了新的类型推导规则

不完全是。如果您点击实际论文的链接,它会显示:

来自 EWG 的指示是我们认为这是 C++14 中的一个缺陷。

这足以让实现者也将其视为缺陷,因此即使在 C++14 模式下也会改变编译器行为。

于 2015-11-03T13:38:14.963 回答