c++ - 是否有任何 C++ 运算符重载是基于其他运算符自动提供的?

标签 c++ operator-overloading compiler-generated

假设我正在写一个 int包装器并需要提供每个单独的运算符重载。作者必须列出每一个,还是可以根据作者提供的内容自动生成任何一个?编译器能否/是否从现有运算符中推断出任何新的自动定义运算符?

如果我定义 operator== ,它会给我一个 operator!= 吗?自动地?还是相反?

如果我定义 operator++() , 我得到 operator++(int)免费?还是相反?

+=怎么样?类型业务?它可以结合 operator+ 的现有定义吗?与 operator=生成 operator+= ?理论上应该可行,但真的可行吗?

>= 的相同问题至 <等,还是我必须完整列出 > 的定义? , > , >= , <=

最佳答案

在核心语言中,各种运算符是独立的。有些是根据其他运算符定义的,但是如果运算符调用的重载解析失败,则不会尝试根据其他运算符来表达该调用。当需要时,程序员可以很容易地表达出来(相反,关闭这种机器可能会更困难)。

std::rel_ops 中有一组关系运算符重载客户端代码可以使用,根据 < 定义和 == .

您可以轻松编写一个混合类,它根据 < 提供关系运算符和 == ,或者就三值而言 compare功能。这是 Curiously Recurring Template Pattern 的最初动机,称为 Barton-Nackman trick .

关于c++ - 是否有任何 C++ 运算符重载是基于其他运算符自动提供的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32816843/

相关文章:

c++ - 从派生引用到基引用的 static_cast 编译器错误

c++ - 如何重载不接受或不返回 ostream 的运算符 <<

java - 编译器生成的默认构造函数会公开吗?

c++ - 抽象基类中的析构函数保护在C++中不被继承?

c++ - 如何在 C++ 编译时生成查找表?

c++ - variadic variadic template 模板特化错误

c++ - 如何获取 GDI 句柄列表

c++ - 如何将 auto_ptr 设置为 NULL

C++ 如何从 dll 中导出静态类成员?

c++ - 无法重载 glm::vec2 '<' 运算符