【发布时间】:2021-09-14 01:56:16
【问题描述】:
考虑以下简单:
#ifndef TEST_H
#define TEST_H
class Test {
public:
static constexpr int a = 1;
}
#endif
注意:
- 没有因宏而违反 ODR。
- 为什么 constexpr static int a 不被视为定义,因为它是在类 Test 中定义的?因为它不是一个定义,因此它需要类之外的以下内容。为什么?
constexpr int Test::a;
【问题讨论】:
-
自 C++17 起不再需要此项。
-
在内联变量之前,所有静态成员变量都必须在单个 TU 中定义,以避免破坏 ODR。 C++17 引入了内联变量,让这个问题迎刃而解。
-
“由于宏没有 ODR 违规。” - 包含守卫不能防止 ODR 违规。它们保护单个 TU 不被重新纳入,但 ODR 适用于整个计划及其所有 TU!
-
请看下面我对杰瑞的问题。发送