Gui*_*cot 22 c++ templates inline c++17
默认情况下,C++ 17中的模板是否内联静态变量?这是一个例子:
template<typename T>
struct SomeClass {
static T test;
};
struct SomeClass2 {
static constexpr int test = 9;
};
Run Code Online (Sandbox Code Playgroud)
这些变量是内联的还是仍然需要使用ODR来定义ODR?
Mar*_* A. 22
A static constexpr隐含也是inline,否则你需要将其标记为inline
template<typename T>
struct SomeClass {
inline static T test; // Now inline
};
struct SomeClass2 {
static constexpr int test = 9; // inline
};
Run Code Online (Sandbox Code Playgroud)
(CFR).来自n4606[depr.static_constexpr]
为了与先前的C++国际标准兼容,可以在类外部冗余地重新声明constexpr静态数据成员而不使用初始化程序.不推荐使用此用法.
例:
Run Code Online (Sandbox Code Playgroud)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).
Bar*_*rry 12
来自[dcl.constexpr]:
使用说明
constexpr符声明的函数或静态数据成员隐式地是内联函数或变量(7.1.6).
类模板的inline静态(非constexpr)数据成员没有这种隐含.但是,在C++ 17中,我们现在可以将变量标记为inline[dcl.inline]:
带有
inline说明符的变量声明声明了一个内联变量.