C++ 17 представил встроенная переменная, и встроенный статический член данных может быть определен в определении класса с инициализатором. Не требует внеклассного определения. Например,
struct X {
inline static int n = 1;
};
Учитывая это, я не вижу причин не использовать встраиваемые статические элементы данных всегда использовать из-за аккуратного синтаксиса. Есть ли ловушка в этом? Обратите внимание, что я не против более медленной компиляции.
@JiveDadson Неявно встроен только статический член данных constexpr
.
Я рекомендую прочитать, что означают эти ключевые слова применительно к переменным.
Это не ловушка, но есть одна причина не использовать inline
: если начальное значение переменной не просто тривиальная константа, а что-то более сложное:
struct X {
inline static int n = and_then_more(figure_out_where_n_comes_from());
};
Теперь объявление figure_out_where_n_comes_from()
и and_then_more()
должно быть вставлено в заголовочный файл.
Кроме того, все, что возвращается figure_out_where_n_comes_from()
, также должно быть объявлено. Это может быть какой-то ужасно сложный class
, который затем передается в and_then_more()
в качестве параметра, чтобы, наконец, вычислить начальное значение для n
.
И все, что #include
помещает в файл заголовка, в котором объявлен X
, теперь должно включать все файлы заголовков для всех этих зависимостей.
Но без inline
все, что у вас есть:
struct X {
static int n;
};
И вам нужно иметь дело со всеми этими зависимостями только в одной единице трансляции, которая создает экземпляр X::x
. Ничто другое из того, что #include
s, только заголовочный файл X
не заботится об этом.
Другими словами: скрытие информации. Если необходимо переопределить исходное значение n
, вы можете перекомпилировать только одну единицу трансляции вместо всего исходного кода.
Обратите внимание на альтернативу: static inline int n = make_n();
- экспортируйте make_n
вместо статической переменной-члена класса. Это просто сбивает с толку (вам все еще нужно что-то определенное в одном месте, сейчас это функция, а не переменная)
Если вашему коду может требоваться C++ 17 (или новее), я бы его использовал.