对于潜在的constexpr对象,所有比较运算符都是constexpr

Should all comparison operators be constexpr for a potentially constexpr object

本文关键字:constexpr 比较 运算符 于潜 对象      更新时间:2023-10-16

使用单个数据成员和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 thanless Thanequals to或CC_11可以具有新的定义。可以自定义的方式定义具有类型坐标对象比较对象的类。例如:

Coordinate c1(3,5)
Coordinate c2(4,2)

我们可以在c1.x == c2.xc1.y==c2.y或两种表达式均为true时返回==操作员以返回true。

constexpr类型对象和structs

也是如此

所有可以constexpr的类的比较运算符也应标记为constexpr?

我也将向更进一步,询问诸如操作员*(s,s)之类的东西是否也应该一直是constexpr。

如果您想编写良好的可用代码,他们肯定应该。

我看不出任何原因,但我也没有看到代码练习。

看到一个很好的例子,请查看STD :: PAIR和STD ::元组实现。但是,通常您不会编写将作为编译时值有用的类。

constexpr规范符声明可以在编译时评估函数或变量的值。然后可以在只允许编译时常数表达式的情况下使用此类变量和函数。

如前所述,如果您的操作员可以用作编译时间常数,请将其声明为constexpr。否则,只需保存一些打字,保持代码的清洁视图,不要混淆其他人。