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

时间:2018-09-18 17:18:52

标签: c++ c++11 standards c++17

全部

传统上,在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;
}

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

有什么想法吗?有评论吗?

1 个答案:

答案 0 :(得分:5)

std::addressof用于通用代码。

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

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

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

几乎没有意义的冗长不是一件好事。