考虑以下具有单个数据成员和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
。
答案 0 :(得分:1)
事情是,比较并不总是用户可以使用标准比较运算符的类型。有时可以比较两个对象,greater than
或less Than
或equals to
可以有新的定义例如,在包含Coordinates类型对象的类中,可以以自定义方式定义比较。例如:
Coordinate c1(3,5)
Coordinate c2(4,2)
我们可以重载==
运算符,只要c1==c2
或c1.x == c2.x
或两个表达式都为真,就会c1.y==c2.y
返回True。
constexpr
类型对象和结构
答案 1 :(得分:0)
是否所有可以constexpr的类的比较运算符都被标记为constexpr?
我还会更进一步,询问运营商*(S,S)之类的东西是否也应该是constexpr。
如果你想编写可用的代码,他们肯定应该。
我没有看到任何理由,但我也没有看到代码练习这个。
要查看一个很好的示例,请查看std :: pair和std :: tuple实现。但是,通常您不会编写可用作编译时值的类。
答案 2 :(得分:0)
constexpr说明符声明可以在编译时评估函数或变量的值。这样的变量和函数可以在只允许编译时常量表达式的情况下使用。
如上所述,如果您的运算符可以用作编译时常量,则将其声明为constexpr。否则,只需保存一些打字,保持清晰的代码视图,不要混淆其他人。