我们应该转向新的自我分配保护方式吗?
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 智能指针也不再是习惯了。我最近看到的唯一用途是有人编写生成函数对象等的表达式。
几乎毫无意义的冗长并不是一件好事。
全部
传统上,在 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 智能指针也不再是习惯了。我最近看到的唯一用途是有人编写生成函数对象等的表达式。
几乎毫无意义的冗长并不是一件好事。