gpt4 book ai didi

c++ - 通过隐式转换小于运算符?

转载 作者:IT老高 更新时间:2023-10-28 22:20:34 26 4
gpt4 key购买 nike

考虑以下类:

struct C 
{
/* Class contents, without any arithmetic operator... */
constexpr operator int() noexcept; // Implicit conversion to int
};

我的问题是:

  • C 是否可用于标准算法,如当前使用默认 < 运算符的 std::sort
  • C 是否满足 LessThanComparable概念?
  • C 是否满足假设的概念化算法库的要求,该算法库要求类型为 LessThanComparable

最佳答案

Is C usable in standard algorithms like std::sort that currently uses the default < operator?

是的,它适用于 std::sort()和其他一些标准算法。代码

#include <algorithm>
#include <vector>

struct C
{
/* Class contents, without any arithmetic operator... */
constexpr operator int() noexcept {return 0;} // Implicit conversion to int
};

int main()
{
std::vector<C> v;
std::sort( begin(v), end(v) );
}

编译。 Here's a live demo.不过请看下一个问题!

Is C considered as satisfying the LessThanComparable concept?

没有。 LessThanComparable 的要求概念是,对于对象 xy类型 Cconst C表达式 x<y有效且可隐式转换为 bool 和 <运算符建立严格的弱排序关系。在您的情况下, const 对象不会转换为 int s。这是您的代码中的一个错误,因为它不是 const 正确的。添加 const关键字将使它工作和类 C确实是LessThanComparable .满足严格的弱排序关系,因为 int满足这个要求。

Will C meet the requirements of an hypothetical conceptified algorithm library that would require the type to be LessThanComparable.

如果你修复你的 constness,是的,它会的。

一些旁注:

  • GCC 4.9 编译 x<y即使xy属于 const C 类型.这似乎是一个编译器错误,因为 GCC 5.2 和 clang 3.6 在这里抛出了编译时错误。

  • 通过std::less<C>()作为 std::sort() 的额外参数给出编译时错误,因为在这种情况下比较函数需要常量对象是可比较的。但是,通过 std::less<void>()不会破坏任何东西,因为参数被完美转发。

  • std::sort() algorithm不需要完整的LessThanComparable , 但概念 Compare .此外,迭代器类型必须是 RandomAccessIteratorValueSwappable并且取消引用的类型必须是 MoveContructableMoveAssignable .这就是您的第一个问题的全部情况,即使没有修复 constness 错误。这就是为什么std::sort()和其他标准算法工作。

关于c++ - 通过隐式转换小于运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34507984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com