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)。