2013-05-20 1 views
14

Похоже, что не разрешено объявлять несколько переменных различных типов, используя ключевое слово auto. Я не могу понять формулировку в стандарте, которая могла бы ее предотвратить.Почему объявления 'auto' должны быть одного типа?

auto i = 1, j = 1.0; //deduction failure (several compilers) 

Исторически я понимаю, так как у вас есть только один Децл-спецификатор-спецификации. Тем не менее, правила в стандарте, похоже, не исключают, на самом деле они поощряют, что auto может быть отдельным типом для каждого. Рассмотрим эти пункты:

8-3 Каждый INIT-описатель в объявлении анализируется отдельно, как если бы это было в заявлении сам по себе.

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

Даже без auto не все переменные должны были иметь тот же тип, так как некоторые модификаторы, как * могут быть применены к каждому описателя индивидуально. Теперь мне кажется, что формулировка позволяет каждому объявлению auto быть совершенно другим типом.

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

+1

BTW - пример использования в 7.1.6.4/3 является 'const auto * v = & x, u = 6; // OK: v имеет тип const int *, u имеет тип const int' - очевидно, идея состоит в том, что вывод типа из первой переменной может быть использован при создании последующих ... –

ответ

9

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

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

+0

Да, эта часть абзаца не была в проекте, который я читал. «...»в моем вопросе приходит после этого. Я купил окончательный стандарт, чтобы проверить свой вопрос, поскольку я был подозрительным. –

+0

Не ответ на самом деле в '[dcl.spec.auto]/6', а не' [dcl.spec.auto]/7'? –

2

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

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

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

+0

N3337 тоже имеет этот параграф. –

+0

Я мог видеть, что это делает его незначительно проще для разработчиков компилятора mayhap. – Yakk