为什么std::ratio不支持比较运算符

Why does std::ratio not support comparison operators?

本文关键字:比较 运算符 不支持 ratio std 为什么      更新时间:2023-10-16

由于C++标准库通常为其类提供重载运算符,我想知道为什么有比较函数(实际上不是真正的函数,而是带有重载()运算符的结构),但没有std::ratio类的比较运算符。

我认为它们将提供更好的使用性和可读性,并且可以在编译时执行。

即使他们的特定解决方案需要使用structs进行模板元编程,也可以将其封装到另一个类似的函数中:

template<intmax_t N1, intmax_t D1, intmax_t N2, intmax_t D2>
constexpr bool operator==(const ratio<N1, D1>& first, const ratio<N2, D2>& second) {
    return ratio_equal<ratio<N1,D1>, ratio<N2,D2>>();
}

实际上对我有效,可以很容易地为所有其他运营商采用

那么,我是不是错过了什么,或者有人知道他们为什么决定不支持这里的运营商吗?

很可能在编写N2661提案时,constexpr还不存在。我发现constexpr的第一次出现是在N2235中,所以很可能至少没有编译器实现它,甚至可能不确定它会在未来的标准中被考虑。这只是一个猜测,也许甚至不值得这个答案。

ratio类不是为实例化而设计的;它没有数据成员,因此基于它的任何对象都不包含类类型本身之外的任何信息。由于运算符必须针对对象而不是类型调用,因此提供它们是毫无意义的。这甚至会适得其反,因为这意味着实例化类会很有用。

如果您确实需要运行时对象而不是编译时类型,我建议ratio可能不是合适的选择。