Является ли он корректным, если я переопределяю переменную как 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

Таким образом, моя интуиция заключается в том, что это надзор в стандарте, и поведение в настоящее время не определено, но если/когда он будет указан, было бы прецедентом сделать его незаконным. (С другой стороны, переменные не могут быть перегружены, поэтому кто знает.)