C++17 では、静的変数はテンプレート内でデフォルトでインライン化されますか? 質問する

C++17 では、静的変数はテンプレート内でデフォルトでインライン化されますか? 質問する

C++17 では、静的変数はテンプレート内でデフォルトでインライン化されますか? 次に例を示します。

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

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

これらの変数はインライン化されていますか、それとも ODR を使用するにはアウトオブライン定義が必要ですか?

ベストアンサー1

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]

以前の C++ 国際標準との互換性のため、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)。

おすすめ記事