为什么这个变量在C++ 14中没有被推导为g ++中的initializer_list?

Des*_*tor 1 c++ auto list-initialization c++14 c++17

考虑以下程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

即使我使用-std=c++14选项,它也可以在ideone上编译.在这里查看现场演示.但是在C++ 14中,变量i应该initializer_list根据此推断出来.

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

对于直接列表初始化:

  1. 对于只包含单个元素的braced-init-list,自动扣除将从该条目中推断出来;

  2. 对于具有多个元素的braced-init-list,自动扣除将是不正确的.

[例:

auto x1 = {1,2}; // decltype(x1)是std :: initializer_list

auto x2 = {1,2.0}; //错误:无法推断出元素类型

auto x3 {1,2}; //错误:不是单个元素

auto x4 = {3}; // decltype(x4)是std :: initializer_list

auto x5 {3}; // decltype(x5)是int.

- 结束例子]

所以,规则改变了C++ 17.因此,当我使用时,程序不应该编译-std=c++14.这是g ++中的错误吗?这个变量不应该i像initializer_listC++ 14 那样推断出来吗?

小智 5

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

不完全是.如果您按照实际论文的链接,它会显示:

EWG的方向是我们认为这是C++ 14中的一个缺陷.

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