C++ ordering类数据成员可见性不一致与标准合规性咨询
结论
GCC 配套的 libstdc++ 与 Clang 配套的 libc++ 实现符合 C++ 标准要求,MSVC 配套 STL 的当前实现不符合标准要求,该问题不属于实现可自由决定的范畴。
标准依据
C++ 标准明确规定 std::strong_ordering、std::weak_ordering、std::partial_ordering 三类比较结果类型的所有非静态数据成员均为实现细节,必须声明为私有,不允许暴露在公共接口中。
标准从未将「可作为非类型模板参数(NTTP)」列为这三类类型的要求特性:C++20 中可作为 NTTP 的结构类型要求所有非静态数据成员均为公共可访问,该规则针对用户自定义类型设计,不适用于标准库的上述比较类型。
实现行为说明
你测试的代码行为差异恰好对应了三类实现的成员可见性区别:
- MSVC STL 将内部存储比较结果的数据成员声明为 public,违反了标准的接口约定,意外赋予了比较结果可作为 NTTP 的额外特性,但同时也暴露了不应该对外公开的实现细节
- libstdc++ 和 libc++ 均将内部数据成员声明为 private,符合标准对接口封装的要求,因此比较结果类型不属于结构类型,无法作为 NTTP 使用,编译报错是预期行为
测试代码
#include <compare> template <auto> struct nttp_test {}; constexpr void swallow(const auto&...) {} int main() { swallow( nttp_test<(1 == 1)>{}, nttp_test<(1 <=> 1)>{} ); }
内容的提问来源于stack exchange,提问作者Desmond Gold
相关产品推荐
相关产品推荐

