我们是否应该转向新的自我分配保护方式?

Shall we move to new way of self-assignment protection?

本文关键字:自我 分配 保护方式 是否 我们      更新时间:2023-10-16

All

传统上,在关于C++的书籍中,甚至在核心指南中,自我分配保护被写成

A& A::operator=(const A& a) {
if (&a != this) {
...
}
return *this;
}

但是在现代C++(自C++-11以来(,我们有std::addressof magic。

如果我教学生现代C++的所有好处,我是否应该提倡将自我作业支票写成

A& A::operator=(const A& a) {
if (std::addressof(a) != this) {
...
}
return *this;
}

更普遍的问题——这是否应该成为核心准则和其他地方要走的路?

思潮?评论?

>std::addressof用于泛型代码。

在泛型代码中,一元operator&可能会被您与之交互的类型重载。 如果你想要真实的地址,那是不行的。

在非泛型代码中,operator&重载既罕见又病态。 任何在类型上重载operator&的人都会使该类型变得非常奇怪,并且无论如何都必须审核它的每次使用。

使用一元operator&重载已经失宠 - 即使是伪com智能指针也已经摆脱了这种习惯。 关于我最近看到的唯一用途是有人编写生成函数对象等的表达式。

几乎毫无意义的冗长并不是一件好事。