对于潜在的constexpr对象,所有比较运算符都是constexpr
Should all comparison operators be constexpr for a potentially constexpr object
使用单个数据成员和operator==
struct S {
int a;
/*constexpr*/ bool operator==(const S& other) const {
return this->a == other.a;
}
};
在其使用中,可以轻松地将两个结构作为constexpr
创建,并具有初始化列表
int main() {
constexpr S s1 = {1};
constexpr S s2 = {2};
constexpr bool b = s1 == s2; // error
return 0;
}
BOOL比较无法编译,因为==
运算符未标记为constexpr
,当该程序编译时。
所有可以将constexpr
的类的比较操作员都应该标记为constexpr
吗?我没有看到任何原因不这样做的原因,但是我也没有看到代码练习。
我也将向更进一步,询问诸如operator*(S, S)
之类的东西是否也应该是constexpr
。
事实是,比较并不总是用户可以使用标准比较操作员的类型。有时可以比较两个对象,而greater than
或less Than
或equals to
或CC_11可以具有新的定义。可以自定义的方式定义具有类型坐标对象比较对象的类。例如:
Coordinate c1(3,5)
Coordinate c2(4,2)
我们可以在c1.x == c2.x
或c1.y==c2.y
或两种表达式均为true时返回==
操作员以返回true。
constexpr
类型对象和structs
所有可以constexpr的类的比较运算符也应标记为constexpr?
我也将向更进一步,询问诸如操作员*(s,s)之类的东西是否也应该一直是constexpr。
如果您想编写良好的可用代码,他们肯定应该。
我看不出任何原因,但我也没有看到代码练习。
看到一个很好的例子,请查看STD :: PAIR和STD ::元组实现。但是,通常您不会编写将作为编译时值有用的类。
constexpr规范符声明可以在编译时评估函数或变量的值。然后可以在只允许编译时常数表达式的情况下使用此类变量和函数。
如前所述,如果您的操作员可以用作编译时间常数,请将其声明为constexpr。否则,只需保存一些打字,保持代码的清洁视图,不要混淆其他人。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 比较字符数组
- Visual C++ constexpr Hints
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 如何比较自定义类的std::变体
- 比较两个 constexpr 指针不是 constexpr?
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 对于潜在的constexpr对象,所有比较运算符都是constexpr
- 支持相等比较的类的constexpr ID
- 为什么比较 constexpr 函数的两个参数不是静态断言的常量条件
- 允许在constexpr函数中比较Is函数指针