Любая потенциальная ловушка использования встроенного статического члена данных?

В 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,

И все, что #includeS заголовочный файл, где X объявлено, теперь должны включать все заголовочные файлы для всех этих зависимостей.

Но без inlineвсе, что у вас есть, это:

struct X {

   static int n;
};

И вам нужно иметь дело со всеми этими зависимостями только в одном модуле перевода, который создает X::x, Больше ничего #includeтолько с XЗаголовочный файл заботится об этом.

Другими словами: скрытие информации. Если необходимо переопределить, где начальное значение n Исходя из этого, вы можете перекомпилировать только один модуль перевода вместо всего исходного кода.

Другие вопросы по тегам