Подтвердить что ты не робот

Можно ли переопределить переменную как автоматическую, которая выводится на тот же тип?

Допускается ли стандартное разрешение?

#include <iostream>

extern int a;
auto a = 3;

int main(int, char**)
{
    std::cout << a << std::endl;
    return 0;
}

clang принимает код. g++ жалуется на конфликтующее объявление.

4b9b3361

Ответ 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;), а с внешним вы также ссылаетесь на определение в другом файле.