排序中数据成员的可见性不一致 class C++
Inconsistency of visibility of data member in ordering class C++
由于运算符 <=>
是在 C++20 中引入的,因此在使用(内置和默认)之前,我们首先需要包含 <compare>
。
但是,我在每个实现(可能使用编译器)中看到了每个排序(std::weak_ordering
、std::partial_ordering
、std::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
来自 MSVC
通过。 (https://godbolt.org/z/8r88sf4qv)
来自 GCC
的 libstdc++
失败。 (https://godbolt.org/z/Mbdzf48Pv)
来自 Clang
的 libc++
也失败了。 (https://godbolt.org/z/9PxdTra3r)
据透露,只有STL
使数据成员public
,其余的都是private
(我的意思是只有数据成员)
我对 STL
感到满意,因为它使 return 值在 NTTP
中可用,但作为交换,它将数据成员暴露给 public .
哪个库实现是正确的?还是取决于每个实施?
该标准根据“仅展示”成员定义 ordering classes。这些成员定义为 private
。另外,没有声明这些 类 中的任何一个都是结构类型。
因此,您不能假设它们是。所以您不能将它们用作 NTTP。一个实现可以这样实现它们,但标准并不要求它。
现在,也许他们应该是。但他们不是。所有这些实现都同样有效。
您可以做的是创建结构类型的并行类型,并将标准库类型转换为它们。这些类型的所有成员都是 constexpr
,因此您可以在不离开常量表达式求值的情况下进行转换。
由于运算符 <=>
是在 C++20 中引入的,因此在使用(内置和默认)之前,我们首先需要包含 <compare>
。
但是,我在每个实现(可能使用编译器)中看到了每个排序(std::weak_ordering
、std::partial_ordering
、std::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
来自MSVC
通过。 (https://godbolt.org/z/8r88sf4qv)
来自 libstdc++
失败。 (https://godbolt.org/z/Mbdzf48Pv)
来自 libc++
也失败了。 (https://godbolt.org/z/9PxdTra3r)
GCC
的 Clang
的 据透露,只有STL
使数据成员public
,其余的都是private
(我的意思是只有数据成员)
我对 STL
感到满意,因为它使 return 值在 NTTP
中可用,但作为交换,它将数据成员暴露给 public .
哪个库实现是正确的?还是取决于每个实施?
该标准根据“仅展示”成员定义 ordering classes。这些成员定义为 private
。另外,没有声明这些 类 中的任何一个都是结构类型。
因此,您不能假设它们是。所以您不能将它们用作 NTTP。一个实现可以这样实现它们,但标准并不要求它。
现在,也许他们应该是。但他们不是。所有这些实现都同样有效。
您可以做的是创建结构类型的并行类型,并将标准库类型转换为它们。这些类型的所有成员都是 constexpr
,因此您可以在不离开常量表达式求值的情况下进行转换。