首页 > 解决方案 > 为什么静态成员和静态常量成员在初始化时不一样?

问题描述

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++staticinitializationconstexpr

解决方案


这是因为在 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也是类似的。constexprconstexpr


推荐阅读