class Test
{
private:
static int data;
public:
static constexpr int MAX{ 10 }; // OK
public:
int getData() const { return data; }
void setData(int rhs) { data = rhs; }
};
int Test::data{};
我有上面这样的代码。为什么静态成员和静态常量成员在初始化时不同?这只是语法上的差异吗?
这是因为在C++17中,constexpr
意味着inline
,允许使用初始化程序进行内联定义。一个更公平的比较是static inline int data{};
,它看起来是一样的。
constexpr
变量必须有一个初始化器(大概是为了在常量表达式中使用它(。在C++17之前,这意味着你必须写:
class Test
{
private:
static int data;
public:
static constexpr int MAX{ 10 };
public:
int getData() const { return data; }
void setData(int rhs) { data = rhs; }
};
constexpr int Test::MAX;
int Test::data{};
以便能够ODR使用MAX
(本质上"取地址"/"绑定引用到"(,因为inline
静态数据成员不存在。这对于constexpr
和非constexpr
静态数据成员也是类似的。