why this variable isn't deduced as initializer_list in g++ in C++14?

拜拜、爱过 提交于 2019-12-24 15:04:54

问题


Consider the following program:

#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;
}

It compiles fine on ideone even when I use -std=c++14 option. See live demo here. But in C++14 the variable i should be deduced as initializer_list according to this.

There is a proposal for C++1z that implements new type deduction rules for brace initialization:

For direct list-initialization:

  1. For a braced-init-list with only a single element, auto deduction will deduce from that entry;

  2. For a braced-init-list with more than one element, auto deduction will be ill-formed.

[Example:

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

auto x2 = { 1, 2.0 }; // error: cannot deduce element type

auto x3{ 1, 2 }; // error: not a single element

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

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

-- end example]

So, the rules changed in C++17. As such, the program shouldn't compile when I use -std=c++14. Is this bug in g++? Shouldn't the variable i deduced as initializer_list in C++14?


回答1:


There is a proposal for C++1z that implements new type deduction rules for brace initialization

Not exactly. If you follow the link to the actual paper, it reads:

Direction from EWG is that we consider this a defect in C++14.

Which is enough to get implementors to also treat it as a defect, and hence change the compiler behaviour even in C++14 mode.



来源:https://stackoverflow.com/questions/33500320/why-this-variable-isnt-deduced-as-initializer-list-in-g-in-c14

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!