【发布时间】:2020-09-20 01:20:52
【问题描述】:
我非常喜欢让编译器为您做尽可能多的工作。在编写一个简单的类时,编译器可以“免费”为您提供以下内容:
- 默认(空)构造函数
- 复制构造函数
- 析构函数
- 赋值运算符 (
operator=)
但它似乎无法为您提供任何比较运算符 - 例如 operator== 或 operator!=。例如:
class foo
{
public:
std::string str_;
int n_;
};
foo f1; // Works
foo f2(f1); // Works
foo f3;
f3 = f2; // Works
if (f3 == f2) // Fails
{ }
if (f3 != f2) // Fails
{ }
这样做有充分的理由吗?为什么执行逐个成员的比较会成为问题?显然,如果该类分配内存,那么您要小心,但是对于一个简单的类,编译器肯定可以为您做到这一点吗?
【问题讨论】:
-
当然,析构函数也是免费提供的。
-
在他最近的一次谈话中,Alex Stepanov 指出没有默认自动分配
==是错误的,就像有默认自动分配 (=)在一定条件下。 (关于指针的论点不一致,因为逻辑适用于=和==,而不仅仅是第二个)。 -
@becko,它是 A9 上的“使用组件进行高效编程”或“编程对话”系列中的第一个,可在 Youtube 上找到。
-
查看此答案以获取 C++20 信息:stackoverflow.com/a/50345359