首页 > 解决方案 > c++11:为什么静态 constexpr 的类内初始化不是定义?

问题描述

考虑以下简单:

#ifndef TEST_H
#define TEST_H

class Test {
public:
    static constexpr int a = 1;
}

#endif

笔记:

  1. 由于宏,没有违反 ODR。
  2. 为什么 constexpr static int a 不被视为定义,因为它是在类 Test 中定义的?因为它不是一个定义,因此它需要类之外的以下内容。为什么?

constexpr int 测试::a;

标签: c++c++11

解决方案


为什么静态 constexpr 的类内初始化不是定义?

由于一个定义规则 (ODR)。该规则规定,每个非内联非成员变量和静态成员变量都必须有一个定义。由于其性质,类定义通常包含在多个翻译单元中。如果类定义包含变量定义,则包含到多个翻译单元中将违反 ODR。

从 C++17 开始,该语言具有内联变量,因此您可以在类定义中定义此类内联变量。


推荐阅读