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

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

全部

传统上,在 C++ 书籍甚至 Core Guidelines 中,自赋值保护被写成

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

但在现代 C++(自 C++-11 起)中,我们拥有 std::addressof 魔法。

如果我向学生传授现代 C++ 的所有优点,我是否应该将自赋值检查写成

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

更一般的问题 - 它应该是核心指南和其他地方要走的路吗?

想法?评论?

std::addressof 用于通用代码。

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

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

一元 operator& 重载的使用已经失宠——甚至连 pseudo-com 智能指针也不再是习惯了。我最近看到的唯一用途是有人编写生成函数对象等的表达式。

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