Любая потенциальная ловушка использования встроенного статического члена данных?
В C++17 введена встроенная переменная, а встроенный статический член данных может быть определен в определении класса с помощью инициализатора. Это не нуждается во внеклассном определении. Например,
struct X {
inline static int n = 1;
};
Учитывая это, я не вижу причин не всегда использовать встроенные статические члены-данные для аккуратного синтаксиса. Есть ли ловушка для этого? Обратите внимание, что я не против медленной компиляции.
1 ответ
Не подводный камень, но вот одна из причин не использовать 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
S заголовочный файл, где X
объявлено, теперь должны включать все заголовочные файлы для всех этих зависимостей.
Но без inline
все, что у вас есть, это:
struct X {
static int n;
};
И вам нужно иметь дело со всеми этими зависимостями только в одном модуле перевода, который создает X::x
, Больше ничего #include
только с X
Заголовочный файл заботится об этом.
Другими словами: скрытие информации. Если необходимо переопределить, где начальное значение n
Исходя из этого, вы можете перекомпилировать только один модуль перевода вместо всего исходного кода.