类内static const声明与类外inline constexpr定义共存的合法性疑问
关于C++
partial_ordering 静态成员的constexpr声明/定义疑问 先看C++标准中partial_ordering类的相关代码片段:
类内静态成员声明
// valid values static const partial_ordering less; static const partial_ordering equivalent; static const partial_ordering greater; static const partial_ordering unordered;
类外成员定义
// valid values' definitions inline constexpr partial_ordering partial_ordering::less(ord::less); inline constexpr partial_ordering partial_ordering::equivalent(ord::equivalent); inline constexpr partial_ordering partial_ordering::greater(ord::greater); inline constexpr partial_ordering partial_ordering::unordered(ncmp::unordered);
已知类内static Type obj声明搭配类外inline Type Class::obj(...)定义等价于inline static Type obj(...),但为何constexpr仅出现在定义而非声明中仍合法?
这是因为C++标准对静态数据成员的constexpr属性有明确规则:
- 类内声明的
static const静态成员,本身已经具备常量属性,类外定义时添加constexpr是对其编译期常量属性的补充声明——constexpr要求该成员的值能在编译阶段确定,而类外的定义通过constexpr结合初始化表达式满足这个要求,同时inline保证符合ODR(一次定义规则)。 - 标准允许将
constexpr放在类外定义中,只要类内声明的成员是const限定的。因为constexpr静态数据成员天然隐含const属性,类内的const声明和类外的constexpr定义完全兼容,二者结合等价于在类内直接声明inline static constexpr partial_ordering less;并配合类外初始化。 - 这种写法也能实现类声明与实现的分离:类声明仅暴露成员的常量特性,把编译期常量的具体初始化逻辑放在类外,保持类接口的简洁性。
内容的提问来源于stack exchange,提问作者bingzhi song
相关产品推荐
相关产品推荐

