我的理解是constexpr
类类型的全局变量几乎无法使用,因为
这样的对象必须在每个 TU 中定义,因为
constexpr
不允许对象的前向声明。默认链接
static
会导致在内联函数中命名对象(使用或不使用 ODR)违反 ODR,因为各自的inline
定义将具有不同的含义。如果对象是 ODR 使用的,那么每个 TU 具有一个定义的声明
extern constexpr
将违反 ODR 规则,这发生在对其进行引用时。- 对隐式
this
参数进行引用,即使成员函数未使用它。 - 如果您尝试通过引用传递对象,显然会发生。
- 如果您尝试按值传递对象,也会发生这种情况,这会隐式使用复制或移动构造函数,根据定义,该构造函数通过引用传递。
- 如果声明了一个对象,
extern constexpr
即使没有使用 ODR,GCC 和 Clang 都会抱怨 ODR 违规(多个定义)。
- 对隐式
这一切都正确吗?有没有办法在constexpr
不将其包装在函数中的情况下拥有一个全局类类型inline
?