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

Rya*_*ing 6 c++ constexpr c++11

考虑以下具有单个数据成员和结构的结构 operator==

struct S {
    int a;
    /*constexpr*/ bool operator==(const S& other) const {
        return this->a == other.a;
    }
};
Run Code Online (Sandbox Code Playgroud)

在使用中,可以像constexpr初始化列表一样轻松创建两个结构

int main() {
    constexpr S s1 = {1};
    constexpr S s2 = {2};
    constexpr bool b = s1 == s2; // error

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

bool比较无法编译,因为==运算符未标记为constexpr,如果是,程序编译.

是否所有类别的比较运算符都constexpr可以标记为constexpr?我没有看到任何理由,但我也没有看到代码练习这个.

我还会更进一步,询问是否operator*(S, S)应该一直constexpr这样.

lis*_*rus 0

任何可以是 constexpr 的类的所有比较运算符是否也应该标记为 constexpr?

我还会更进一步询问像operator*(S, S) 这样的东西是否也应该始终是constexpr。

如果您想编写很好用的代码,那么它们当然应该这样做。

我看不出有什么理由不这样做,但我也没有看到代码实践这一点。

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