Можно ли переопределить переменную как автоматическую, которая выводится на тот же тип?
Допускается ли стандартное разрешение?
#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
std::cout << a << std::endl;
return 0;
}
clang принимает код.
g++ жалуется на конфликтующее объявление.
Ответ 1
Это не очень ясно для меня из стандарта, но тогда есть это написано
раздел 7.1.6.4 авто-спецификатор Программа, которая использует auto в контексте, явно не разрешенном в этом разделе, плохо сформирована.
Лучше прочитать упомянутый раздел стандарта для всех разрешенных контекстов.
Учитывая это, я считаю, что g++ корректен, а clang - неправильный. Но я мог ошибаться, может быть какой-то отдельный раздел в стандарте, который может подразумевать этот контекст, но я не мог его найти.
Ответ 2
Изменить ответ:
Как упоминание в комментариях. Проблема в этом случае заключается в том, что написание
external int a;
auto a = 3;
- это то же самое, что и написание
external int a;
int a = 3;
это означает, что у вас есть новое определение a и которое вызывает ошибку.
Первый ответ:
Для моего понимания это нарушает части правила Единого определения. В частности, я имею в виду следующее правило (в отношении MISRA С++ 2008), в котором говорится, что идентификатор с внешней связью должен всегда иметь только одно определение. В вашем примере у вас есть определение в текущем файле (auto a = 3;), а с внешним вы также ссылаетесь на определение в другом файле.