почему эта переменная не выводится как initializer_list в g ++ в C ++ 14?

Рассмотрим следующую программу:

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

Он отлично компилируется на ideone, даже когда я использую параметр -std=c++14. См. Интерактивную демонстрацию здесь. Но в C ++ 14 переменная i должна выводиться как initializer_list в соответствии с это.

Существует предложение для 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 ++? Разве переменная i не должна выводиться как initializer_list в C ++ 14?


person Destructor    schedule 03.11.2015    source источник
comment
См. Другое поведение компилятора для выражения: auto p {make_pointer ()};, неясно, должно ли упомянутое там предложение применимы к C ++ 14 или нет, по этому поводу имеется противоречивая информация. Здесь также есть расхождения в реализации.   -  person Shafik Yaghmour    schedule 03.11.2015
comment
@ T.C. спасибо, что откопали это, интересно, но голова в настоящее время 3.8, и поведение не изменилось, и он все еще не отвечает, было ли это решено как дефект или нет :-(   -  person Shafik Yaghmour    schedule 03.11.2015


Ответы (1)


Существует предложение для C ++ 1z, реализующее новые правила вывода типов для инициализации скобок.

Не совсем. Если вы перейдете по ссылке на настоящую статью, она гласит:

По указанию EWG, мы считаем это недостатком C ++ 14.

Этого достаточно, чтобы разработчики также рассматривали это как дефект и, следовательно, изменяли поведение компилятора даже в режиме C ++ 14.

person Community    schedule 03.11.2015
comment
Вы можете привести аргумент, что реализация не должна рассматривать это как дефект C ++ 14, пока не будет официального DR, но меня не убедит такой аргумент, я думаю, что поведение GCC, по крайней мере, не является неправильным. - person ; 03.11.2015
comment
Если вы не пресечете эти вещи в зародыше, задний край соответствия может немного выйти из-под контроля. Мне вспоминается кошмар, связанный с совместимостью веб-браузеров: Microsoft said that Acid3 did not agree with the goal of [IE8] and that IE8 would improve only some of the standards... scored 20/100, which is much worse than all relevant competitors... ИМХО, GCC может наступить исключительно на пятки, если это то, что нужно для сдерживания такого рода расхождений. - person John P; 26.12.2017