Подтвердить что ты не робот

Статические переменные, встроенные по умолчанию внутри шаблонов в С++ 17?

Статические переменные, встроенные по умолчанию внутри шаблонов в С++ 17? Вот пример:

template<typename T>
struct SomeClass {
    static T test;
};

struct SomeClass2 {
    static constexpr int test = 9;
};

Являются ли эти переменные в строгом или все еще нуждаются в определении линии вне ODR?

4b9b3361

Ответ 1

A static constexpr также неявно будет inline, в противном случае вам нужно будет пометить его как inline

template<typename T>
struct SomeClass {
    inline static T test; // Now inline
};

struct SomeClass2 {
    static constexpr int test = 9; // inline
};

ЧФР. от n4606 [depr.static_constexpr]

Для совместимости с предыдущими стандартами С++, статический элемент constexpr может быть избыточно переопределен вне класса без инициализатора. Это использование устарело.

Пример:

struct A {
  static constexpr int n = 5; // definition (declaration in C++ 2014)
};
const int A::n; // redundant declaration (definition in C++ 2014)

и [dcl.constexpr] (Барри избил меня)

Функция или элемент статических данных, объявленный с помощью спецификатора constexpr, неявно является встроенной функцией или переменной (7.1.6).

Ответ 2

Из [dcl.constexpr]:

Функция или статический член данных, объявленный с помощью constexprspecifier неявно является встроенной функцией или переменной (7.1.6).

Нет таких неявных inline для статических (не constexpr) элементов данных шаблонов классов. Однако в С++ 17 теперь мы можем пометить сами переменные как inline, [dcl.inline]:

Объявление переменной с помощью спецификатора inline объявляет встроенную переменную.