std::strong_ordering 和 std::weak_ordering 的实际意义
Practical meaning of std::strong_ordering and std::weak_ordering
我一直在阅读一些关于 C++20 的 consistent comparison(即 operator<=>
)的内容,但无法理解 std::strong_ordering
和 [=14= 之间的实际区别是什么](同样适用于这种方式的 _equality
版本)。
除了对类型的可替代性进行非常详细的描述之外,它是否真的会影响生成的代码?它是否对如何使用该类型添加了任何限制?
很想看到一个真实的例子来证明这一点。
Does it add any constraints for how one could use the type?
一个非常重要的约束(原始论文并非有意)是 P0732 as an indicator that a class type can be used as a non-type template parameter. weak_ordering
isn't sufficient for this case due to how template equivalence has to work. This is no longer the case, as non-type template parameters no longer work this way (see P1907R0 for explanation of issues and P1907R1 采用了 strong_ordering
的重要性作为新规则的措辞) .
一般来说,有些算法可能只需要 weak_ordering
,而其他算法可能需要 strong_ordering
,因此能够在类型上注释可能意味着编译错误(提供的顺序不够强)只是在运行时无法满足算法的要求,因此只是未定义的行为。但是标准库中的所有算法和我所知道的范围 TS 都只需要 weak_ordering
。我不知道需要 strong_ordering
的人。
Does it actually affect the generated code?
除了需要 strong_ordering
或算法根据比较类别明确选择不同行为的情况外,没有。
确实没有理由std::weak_ordering
。的确,该标准描述了诸如根据 "strict" weak order 排序的操作,但是在严格的弱排序和 totally 有序 partition[=38] 之间存在同构=] 的原始集合变成无可比拟的等价 classes。很少遇到对 order 结构(将每个等价 class 视为一个“值”)和 [= 的一些可能更好的概念感兴趣的通用代码31=]equivalence:请注意,当标准库使用 <
(或 <=>
)时,它不会使用 ==
(可能更好)。
std::weak_ordering
的常见示例是不区分大小写的字符串,因为例如打印两个仅大小写不同的字符串肯定会产生不同的 行为 ,尽管它们是等价的(在任何运营商下)。然而,尽管是 ==
,许多类型可能有不同的行为:例如,两个 std::vector<int>
对象可能具有相同的内容和不同的容量,因此附加到它们可能会使迭代器以不同的方式失效。
一个简单的事实是,std::strong_ordering::equivalent
而不是 std::weak_ordering::equivalent
隐含的“平等”与将从中受益的代码 无关 它,因为 generic 代码不依赖于隐含的行为变化,非泛型代码不需要区分排序类型,因为它知道排序类型的规则它运行。
该标准试图通过谈论“可替代性”来赋予区分意义,但这不可避免地 循环 因为它只能明智地指代比较所检查的状态。 was discussed 在发布 C++20 之前,但是(可能出于显而易见的原因)计划中的进一步讨论并没有发生。
我一直在阅读一些关于 C++20 的 consistent comparison(即 operator<=>
)的内容,但无法理解 std::strong_ordering
和 [=14= 之间的实际区别是什么](同样适用于这种方式的 _equality
版本)。
除了对类型的可替代性进行非常详细的描述之外,它是否真的会影响生成的代码?它是否对如何使用该类型添加了任何限制?
很想看到一个真实的例子来证明这一点。
Does it add any constraints for how one could use the type?
一个非常重要的约束(原始论文并非有意)是 P0732 as an indicator that a class type can be used as a non-type template parameter. This is no longer the case, as non-type template parameters no longer work this way (see P1907R0 for explanation of issues and P1907R1 采用了 weak_ordering
isn't sufficient for this case due to how template equivalence has to work.strong_ordering
的重要性作为新规则的措辞) .
一般来说,有些算法可能只需要 weak_ordering
,而其他算法可能需要 strong_ordering
,因此能够在类型上注释可能意味着编译错误(提供的顺序不够强)只是在运行时无法满足算法的要求,因此只是未定义的行为。但是标准库中的所有算法和我所知道的范围 TS 都只需要 weak_ordering
。我不知道需要 strong_ordering
的人。
Does it actually affect the generated code?
除了需要 strong_ordering
或算法根据比较类别明确选择不同行为的情况外,没有。
确实没有理由std::weak_ordering
。的确,该标准描述了诸如根据 "strict" weak order 排序的操作,但是在严格的弱排序和 totally 有序 partition[=38] 之间存在同构=] 的原始集合变成无可比拟的等价 classes。很少遇到对 order 结构(将每个等价 class 视为一个“值”)和 [= 的一些可能更好的概念感兴趣的通用代码31=]equivalence:请注意,当标准库使用 <
(或 <=>
)时,它不会使用 ==
(可能更好)。
std::weak_ordering
的常见示例是不区分大小写的字符串,因为例如打印两个仅大小写不同的字符串肯定会产生不同的 行为 ,尽管它们是等价的(在任何运营商下)。然而,尽管是 ==
,许多类型可能有不同的行为:例如,两个 std::vector<int>
对象可能具有相同的内容和不同的容量,因此附加到它们可能会使迭代器以不同的方式失效。
一个简单的事实是,std::strong_ordering::equivalent
而不是 std::weak_ordering::equivalent
隐含的“平等”与将从中受益的代码 无关 它,因为 generic 代码不依赖于隐含的行为变化,非泛型代码不需要区分排序类型,因为它知道排序类型的规则它运行。
该标准试图通过谈论“可替代性”来赋予区分意义,但这不可避免地 循环 因为它只能明智地指代比较所检查的状态。 was discussed 在发布 C++20 之前,但是(可能出于显而易见的原因)计划中的进一步讨论并没有发生。