1

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

但是,我在每个实现(可能使用编译std::weak_ordering器)中std::partial_ordering看到每个排序(用于非类型模板参数。std::strong_orderingoperator<=>

我已经在 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因为它使返回值在 中可用NTTP,但作为交换,它将数据成员公开给公众。

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

4

1 回答 1

4

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

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

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

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

于 2021-09-01T14:19:48.610 回答