Почему объявления "auto" должны быть одного типа?
Похоже, что не разрешено объявлять несколько переменных различных типов с помощью ключевого слова auto
. Я не могу понять формулировку в стандарте, которая предотвратила бы это.
auto i = 1, j = 1.0; //deduction failure (several compilers)
Исторически я понимаю, поскольку у вас есть только один spec-specifier. Тем не менее, правила в стандарте, похоже, не исключают, на самом деле они поощряют, что auto
может быть отдельным типом для каждого. Рассмотрим следующие параграфы:
8-3 Каждый декларатор init в декларации анализируется отдельно, как если бы он был в декларации сам по себе.
7.1.6.4-7 Если список деклараторов содержит более одного декларатора, определяется тип каждой объявленной переменной как описано выше. [...]
Даже без auto
не все переменные должны иметь один и тот же тип, так как некоторые модификаторы типа *
могут применяться к каждому декларатору индивидуально. Теперь мне кажется, что формулировка позволяет каждому декларатору auto
быть полностью отличным типом.
Какой пункт запретил бы это?
Ответы
Ответ 1
Вычисление типа выполняется для каждого объекта в списке, но конечным результатом должен быть один тип [dcl.spec.auto]/7
(выделение мое):
Если список деклараторов содержит более одного декларатора, тип каждой объявленной переменной определяется, как описано выше. Если тип, выведенный для параметра шаблона U, не является одинаковым в каждом выводе, программа плохо сформирована.
Ответ 2
Я нашел исправленную формулировку (это одна из тех, которая фактически отличается от окончательного позднего черновика и официального стандарта).
7.1.6.4-7 Если список деклараторов содержит более одного декларатора, определяется тип каждой объявленной переменной как описано выше. Если тип, выводимый для параметра шаблона U, не является одинаковым в каждом выводе, программа плохо сформирована.
Где 'U' описывается в предыдущем абзаце как изобретенный тип, используемый для вычитания каждого параметра. Это неудачное изменение проекта, поскольку это было бы очень приятной особенностью. (Я также могу неправильно понимать предыдущий параграф в стандарте, поскольку он также относится к std:: initializer_list)