Рассмотрим следующую программу:
#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, которое реализует новые правила вывода типов для инициализации фигурных скобок:
Для прямой инициализации списка:
Для списка инициализации в фигурных скобках, содержащего только один элемент, автоматический вывод будет выводиться из этой записи;
Для списка-инициализации в фигурных скобках с более чем одним элементом автоматическое выведение будет неправильно сформировано.
[Пример:
авто 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?
3.8
, и поведение не изменилось, и он все еще не отвечает, было ли это решено как дефект или нет :-( - person Shafik Yaghmour   schedule 03.11.2015