默认情况下,C ++ 17中的模板是否内联静态变量?这是一个例子:
template<typename T>
struct SomeClass {
static T test;
};
struct SomeClass2 {
static constexpr int test = 9;
};
这些变量是内联的还是仍然需要使用ODR来定义?
答案 0 :(得分:22)
static constexpr
隐式也是inline
,否则您需要将其标记为inline
template<typename T>
struct SomeClass {
inline static T test; // Now inline
};
struct SomeClass2 {
static constexpr int test = 9; // inline
};
(CFR)。来自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)。
答案 1 :(得分:12)
来自[dcl.constexpr]:
使用
constexpr
声明的函数或静态数据成员 说明符隐式地是内联函数或变量(7.1.6)。
类模板的静态(非inline
)数据成员没有这种隐式constexpr
。但是,在C ++ 17中,我们现在可以将变量标记为inline
,[dcl.inline]:
带有
inline
说明符的变量声明声明了一个内联变量。