【发布时间】:2017-10-13 09:12:44
【问题描述】:
我有一个关于 constexpr 定义文本类型的静态数据成员的问题,该成员在类定义中声明为 const(而不是指定 inline 或 constexpr):
// S.h
struct S
{
static int const i; // not specified inline or constexpr
};
// S.cpp
#include "S.h"
constexpr int const S::i = 42; // definition, not declaration
// main.cpp
#include "S.h"
int main()
{
return S::i;
}
Clang/gcc 在 C++11/14 模式下返回 42,但在 C++17 模式下报错(未定义对 S::i 的引用)。如果我注释掉 constexpr 在 C++17 模式下也都返回 42。
S::i 具有外部链接,因为 S 具有外部链接。 S::i 未声明为 constexpr,因此(如果我没记错的话)C++17 10.1.5 p1 不适用:
使用 constexpr 声明的函数或静态数据成员 说明符隐式是内联函数或变量
我理解这句话的意思是(大胆的理解): 在类定义中使用 constexpr 说明符声明的静态数据成员隐式是内联变量
S::i 因此不是内联变量。 然而,S::i 的定义似乎在 C++17 模式下具有内部链接,就好像 constexpr 表示内联一样。它是否正确?如果是这样,标准中的证明在哪里?
还是我误解了 10.1.5 p1,它的真正意思是(大胆的误解): 在类定义和命名空间范围内的定义中使用 constexpr 说明符声明的静态数据成员隐式是内联变量?
【问题讨论】: