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

问题描述 投票:6回答:3

考虑以下具有单个数据成员和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

c++ c++11 constexpr
3个回答
1
投票

事情是,比较并不总是用户可以使用标准比较运算符的类型。有时可以比较两个对象,greater thanless Thanequals to可以有新的定义。例如,在一个类中包含Coordinates Comparison类型的对象可以是以自定义方式定义。例如 :

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

我们可以重载==运算符,只要c1==c2c1.x == c2.x或两个表达式都为真,就返回c1.y==c2.y的True。

constexpr类型的对象和结构也是如此


0
投票

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

我还会更进一步,询问运营商*(S,S)之类的东西是否也应该是constexpr。

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

我没有看到任何理由,但我也没有看到代码练习这个。

要查看一个很好的示例,请查看std :: pair和std :: tuple实现。但是,通常您不会编写可用作编译时值的类。


0
投票

constexpr说明符声明可以在编译时评估函数或变量的值。然后可以在仅允许编译时常量表达式的情况下使用这些变量和函数。

如上所述,如果您的运算符可以用作编译时常量,请将其声明为constexpr。否则,只需保存一些打字,保持清晰的代码视图,不要混淆其他人。

© www.soinside.com 2019 - 2024. All rights reserved.