我们应该采用新的自我分配保护方式吗?

Sev*_*eux -2 c++ standards c++11 c++17

所有

传统上,在有关C ++的书籍中,甚至在核心准则中,自我分配保护都写为

A& A::operator=(const A& a) {
    if (&a != this) {
       ...
    }
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我要教给学生现代C ++的所有好处,我是否应该提倡将自赋值检查写成:

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

更笼统的问题-《核心指南》和其他地方应该走这条路吗?

有什么想法吗?评论?

Yak*_*ont 5

std::addressof 适用于通用代码。

在通用代码中,operator&与您交互的类型可能会使一元代码过载。而且,如果您想要真实的地址,那将不会。

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

一元operator&重载的使用已不受欢迎-甚至伪com智能指针也已摆脱习惯。我最近看到的唯一用法是有人编写产生函数对象之类的表达式。

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