Рассмотрим следующий заголовок и предположим, что он используется в нескольких TU:
static int x = 0;
struct A {
A() {
++x;
printf("%d\n", x);
}
};
Поскольку этот вопрос объясняет, что это нарушение ODR и, следовательно, UB.
Теперь, нет нарушения ODR , если наша функция inline
ссылается на не-1011 * 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
?