Если у меня есть constexpr, определенный в анонимном пространстве имен в файле .cpp. Должен ли он быть объявлен как встроенный? Или нет?
В чем будет разница между двумя декларациями?
// In my.cpp
namespace {
constexpr int kVal{4};
// or
inline constexpr int kOtherVal{4};
} // anonymous namespace
// Later a class or function in my.cpp uses the constant
На самом деле это не имеет значения. Имена (включая переменные) в безымянном пространстве имен имеют внутреннюю связь. inline
позволяет каждому исходному файлу отдельно определять переменную без проблем, связанных с несколькими определениями. Итак, вы достигаете одного и того же, с ключевым словом inline
или без него. Кроме того, в лучшем случае inline
является подсказкой для компилятора, и компилятору разрешено его игнорировать (т. е. если добавление inline
может достичь чего-то большего, чем размещение переменной в анонимном пространстве имен, с вашим конкретным компилятором, ваш компилятор не обязан сделай это).
Смотрите обман: Являются ли объекты в анонимном пространстве имен неявно статическими?
Отметка объекта как inline
может служить двум целям:
Но поскольку все имена в безымянном пространстве имен (включая имена переменных) имеют внутреннюю связь, в данном случае это не имеет особого значения (только одна единица перевода имеет доступ к имени).
Поэтому здесь особой разницы нет.
Что будет (1) делать с переменными (в отличие от функций)?
@HolyBlackCat, ты прав. Изменил формулировку.
Я не думаю, что для этого есть основания. Все имена в безымянном пространстве имен имеют внутреннюю связь. Для меня
inline
не является знаком встраивания этого кода, хотя его можно использовать как подсказку: компилятор может игнорировать его для целей встраивания.