为什么静态成员和静态常量成员在初始化时不同


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静态数据成员也是类似的。

最新更新