Вероятно, это не последняя версия, но мой черновой стандарт C ++ 0x от июня 2008 г. говорит, что вы можете делать следующее:
auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
Так что, если что-то не изменилось с июня, это (или будет) разрешено в ограниченной форме с довольно интуитивным толкованием.
Ограничение состоит в том, что если вы хотите выстроить несколько автоматических объявлений, как это (используя пример выше), это работает, потому что выведенный тип v
и u
имеет один и тот же «базовый тип» (int в этом case) использовать неточный термин.
Если вам нужно точное правило, проект стандарта гласит:
Если список деклараторов содержит более одного декларатора, тип каждой объявленной переменной определяется как описано
выше. Если тип, выведенный для параметра шаблона U, не одинаков при каждом вычете, программа некорректна.
где "выводимый параметр шаблона U" определяется по:
выведенный тип параметра u в вызове f (expr) следующего изобретенного шаблона функции:
`template <class U> void f(const U& u);`
Почему они придумали это правило вместо того, чтобы сказать что-то вроде:
auto a = 10, b = 3.f , * c = new Class();
эквивалентно:
auto a = 10;
auto b = 3.f;
auto * c = new Class();
Я не знаю. Но я не пишу компиляторы. Вероятно, что-то связанное с тем, что вы выяснили, что ключевое слово auto
заменяет, вы не можете изменить его в том же выражении.
Взять например:
int x = 5;
CFoo * c = new CFoo();
auto a1 = x, b1 = c; // why should this be permitted if
int a2 = x, CFoo* b2 = c; // this is not?
В любом случае, я в любом случае не люблю помещать несколько объявлений в одно и то же утверждение.