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

时间:2014-01-20 20:37:07

标签: c++ c++11 constexpr

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

3 个答案:

答案 0 :(得分:1)

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

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

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

constexpr类型对象和结构

也是如此

答案 1 :(得分:0)

  

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

     

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

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

  

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

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

答案 2 :(得分:0)

  

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

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