Почему объявления "auto" должны быть одного типа? - программирование
Подтвердить что ты не робот

Почему объявления "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 быть полностью отличным типом.

Какой пункт запретил бы это?

4b9b3361

Ответ 1

Вычисление типа выполняется для каждого объекта в списке, но конечным результатом должен быть один тип [dcl.spec.auto]/7 (выделение мое):

Если список деклараторов содержит более одного декларатора, тип каждой объявленной переменной определяется, как описано выше. Если тип, выведенный для параметра шаблона U, не является одинаковым в каждом выводе, программа плохо сформирована.

Ответ 2

Я нашел исправленную формулировку (это одна из тех, которая фактически отличается от окончательного позднего черновика и официального стандарта).

7.1.6.4-7 Если список деклараторов содержит более одного декларатора, определяется тип каждой объявленной переменной как описано выше. Если тип, выводимый для параметра шаблона U, не является одинаковым в каждом выводе, программа плохо сформирована.

Где 'U' описывается в предыдущем абзаце как изобретенный тип, используемый для вычитания каждого параметра. Это неудачное изменение проекта, поскольку это было бы очень приятной особенностью. (Я также могу неправильно понимать предыдущий параграф в стандарте, поскольку он также относится к std:: initializer_list)