c++ - 为什么静态成员和静态常量成员在初始化时不一样?
问题描述
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
推荐阅读
- kubernetes - 通过 kubedns 访问 Pod 而不暴露为服务
- php - 图像中的回声
- powershell - 如何将机器 OU 的要求应用到 SCCM 部署类型
- github - 尝试使用 git 合并两个分支时文件被覆盖
- excel - 当通过公式更改不同的触发单元格时,如何一次启动两个 VBA 宏?
- angular - RxJs:扫描完成后扫描做动作
- nginx - 同一后端服务器上的 Nginx 负载均衡器
- neo4j - 在 Neo4j OGM 中映射而不是设置关系
- java - 执行集成测试时如何禁用spring cloud zookeeper
- javascript - 我可以仅在 Windows 上加载 css 文件吗?