Я не могу думать ни о каком, потому что, если мы сдерживаем обещание иметь точно такое же определение встроенной переменной с внешней связью через 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
?