Является ли он корректным, если я переопределяю переменную как auto, а выведенный тип тот же?
Посмотрите на этот фрагмент:
int a;
extern int b;
auto b = a;
Хорошо ли он сформирован? Clang успешно компилирует его, но GCC и MSVC этого не делают.
(Эта проблема возникла, когда я ответил Как объявить и определить статический член с выведенным типом?)
Ответы
Ответ 1
Tl; DR;
clang является правильным, логика заключается в том, что это разрешено [dcl.spec.auto]
и для ограничения этого для выведенных типов возвращаемого значения [dcl.spec.auto] p11 было добавлено, в противном случае нет ограничений, и поэтому это не ограничивается для переменные.
См. Мой более полный ответ в дубликате
Ответ 2
Clang, GCC, MSVC. (Этот ответ ранее заявил, что все 3 компилятора откажутся его строить, но это было неверно.)
dcl.spec.auto не учитывает совместимость нескольких объявлений одной и той же переменной при смешивании спецификатора auto
типа с другими спецификаторами типа. Однако он обращается к ним для типов возвращаемых функций:
auto f();
auto f() { return 42; } // return type is int
auto f(); // OK
int f(); // error, cannot be overloaded with auto f()
decltype(auto) f(); // error, auto and decltype(auto) don't match
Таким образом, моя интуиция заключается в том, что это надзор в стандарте, и поведение в настоящее время не определено, но если/когда он будет указан, было бы прецедентом сделать его незаконным. (С другой стороны, переменные не могут быть перегружены, поэтому кто знает.)