全部
传统上,在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;
}
更一般的问题-《核心指南》和其他地方应该走这条路吗?
有什么想法吗?有评论吗?
答案 0 :(得分:5)
std::addressof
用于通用代码。
在通用代码中,与之交互的类型可能会使一元operator&
重载。而且,如果您想要真实的地址,那是不会的。
在非通用代码中,operator&
重载既罕见又是病态的。在类型上重载operator&
的任何人都将使该类型变得异常怪异,并且无论如何都要审核它的每次使用。
使用一元operator&
重载已不受欢迎-甚至伪com智能指针也已摆脱习惯。我最近看到的唯一用法是有人编写可产生函数对象等的表达式。
几乎没有意义的冗长不是一件好事。