Я не могу думать ни о каком, потому что, если мы сдерживаем обещание иметь точно такое же определение встроенной переменной с внешней связью через TU, компилятор может выбрать любой из них для ссылки на переменную, это будет то же самое технически, так как имеет только один TU и имеет глобальную переменную, объявленную в заголовке с соответствующими защитниками заголовка

отрим следующий заголовок и предположим, что он используется в нескольких TU:

static int x = 0;

struct A {
    A() {
        ++x;
        printf("%d\n", x);
    }
};

Какэтот вопрос объясняет, что это нарушение ODR и, следовательно, UB.

В настоящее время,нет нарушения ODR если нашinline функция относится кvolatile const объект, и мы не используем его в этой функции (плюс другие положения), так что в заголовке все равно работает:

constexpr int x = 1;

struct A {
    A() {
        printf("%d\n", x);
    }
};

Но если нам случится использовать его с помощью odr, мы вернемся на круги своя с UB:

constexpr int x = 1;

struct A {
    A() {
        printf("%p\n", &x);
    }
};

Таким образом, учитывая, что мы имеем сейчасinline переменные, не должны быть ориентиром, чтобы отметить всеnamespaceпеременные какinline в заголовках, чтобы избежать всех проблем?

constexpr inline int x = 1;

struct A {
    A() {
        printf("%p\n", &x);
    }
};

Это также, кажется, легче учить, потому что мы можем просто сказать:inline-все в заголовках »(т.е. определения функций и переменных), а также« никогдаstatic в заголовках ".

Это рассуждение правильно? Если да, есть ли какие-либо недостатки в том, чтобы всегда отмечатьconst а такжеconstexpr переменные в заголовках какinline?

Ответы на вопрос(1)

Ваш ответ на вопрос