排序中数据成员的可见性不一致 class C++

Inconsistency of visibility of data member in ordering class C++

由于运算符 <=> 是在 C++20 中引入的,因此在使用(内置和默认)之前,我们首先需要包含 <compare>

但是,我在每个实现(可能使用编译器)中看到了每个排序(std::weak_orderingstd::partial_orderingstd::strong_ordering)的不同实现,但最值得注意的是结果 数据在 operator<=> 比较后的可见性,其中影响作为 结构类型 的资格,可用于非类型模板参数。

我已经在 3 个主要库实现中测试了这段代码:libstdc++libc++ (or libcxx)STL:

#include <compare>

template <auto>
struct nttp_test {};

constexpr void swallow(const auto&...) {}

int main() {

    swallow(
        nttp_test<(1 == 1)>{},
        nttp_test<(1 <=> 1)>{}
    );
    
}

其中:

据透露,只有STL使数据成员public,其余的都是private(我的意思是只有数据成员)

我对 STL 感到满意,因为它使 return 值在 NTTP 中可用,但作为交换,它将数据成员暴露给 public .

哪个库实现是正确的?还是取决于每个实施?

该标准根据“仅展示”成员定义 ordering classes。这些成员定义为 private。另外,没有声明这些 类 中的任何一个都是结构类型。

因此,您不能假设它们是。所以您不能将它们用作 NTTP。一个实现可以这样实现它们,但标准并不要求它。

现在,也许他们应该是。但他们不是。所有这些实现都同样有效。

可以做的是创建结构类型的并行类型,并将标准库类型转换为它们。这些类型的所有成员都是 constexpr,因此您可以在不离开常量表达式求值的情况下进行转换。