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:
For a braced-init-list with only a single element, auto deduction will deduce from that entry;
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?
3.8
and the behavior has not changed and it still doesn't answer whether this was decided as a defect or not :-( – Trivalent