我们是否应该转向新的自我分配保护方式?
Shall we move to new way of self-assignment protection?
All
传统上,在关于C++的书籍中,甚至在核心指南中,自我分配保护被写成
A& A::operator=(const A& a) {
if (&a != this) {
...
}
return *this;
}
但是在现代C++(自C++-11以来(,我们有std::addressof magic。
如果我教学生现代C++的所有好处,我是否应该提倡将自我作业支票写成
A& A::operator=(const A& a) {
if (std::addressof(a) != this) {
...
}
return *this;
}
更普遍的问题——这是否应该成为核心准则和其他地方要走的路?
思潮?评论?
>std::addressof
用于泛型代码。
在泛型代码中,一元operator&
可能会被您与之交互的类型重载。 如果你想要真实的地址,那是不行的。
在非泛型代码中,operator&
重载既罕见又病态。 任何在类型上重载operator&
的人都会使该类型变得非常奇怪,并且无论如何都必须审核它的每次使用。
使用一元operator&
重载已经失宠 - 即使是伪com智能指针也已经摆脱了这种习惯。 关于我最近看到的唯一用途是有人编写生成函数对象等的表达式。
几乎毫无意义的冗长并不是一件好事。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 我们是否应该转向新的自我分配保护方式?
- 自我分配变量的定义
- 自我分配有用时是否存在情况
- 再次自我分配保护
- 为什么Visual Studio在自我分配时不触发警告(int foo = foo;)
- 为什么我的分配操作员不处理自我分配