何时使用 addressof(x) 而不是 &x?
When to use addressof(x) instead of &x?
获取对象地址时,如何决定是否需要addressof(x)
而不是&x
?
这个问题似乎令人困惑,因此需要澄清:
addressof
显然绕过了运算符的过载地址我已经意识到了
我想知道的是:
我怎么知道这是否是我真正想做的?(尤其是在模板内等)
是否有某种"规则"可以帮助我确定何时需要addressof
而不是&
毕竟,它们都返回对象的"地址",那么我什么时候使用哪个呢?
当你必须使用std::addressof
时。遗憾的是,"当你必须"包括了你在模板代码中工作并希望将未知类型T
或T&
的变量变成指向该变量内存的诚实指针的任何时候。
因为C++委员会愚蠢地允许引用运算符过载(几乎没有合法的目的),用户可以用某种类型实例化模板,而你不能使用引用运算符来获得实际的指针。std::addressof
是一种绕过那些使用这种可疑C++功能的用户的方法,目的是做语言一开始就应该保证能工作的事情。
简言之,这是对语言愚蠢的图书馆修复。如果您想确保用户不会破坏您的代码,请在模板代码中使用它,而不是&
。如果您的用户不会使用这个考虑不周的功能,那么您可以使用&
。
如果它是一个带有重载一元operator&
的用户定义类型,并且您想要它的地址,请使用addressof
。
我想说的是,您应该始终使用&
,因为正如您所说,如果不这样做,就会破坏过载的目的除非当然你用重载做了一些有意义的事情,在这种情况下,你需要addressof
(在类外,在类内你可以只使用this
),但你必须非常确定你在做什么。
这里还有更多内容-如果你想在类外重载operator&
(你可以),你必须使用addressof
来返回地址,否则会导致无限递归:
struct Class
{
virtual ~Class() {}
int x;
};
void* operator&(const Class& x)
{
//return &x; <---- infinite recursion
return addressof(x) + 4; //I know this isn't safe
//but I also know the intrinsics of my compiler
//and platform to know this will actually return
//the address to the first data member
}
我知道这不安全
当您想知道对象的实际地址,而不是operator&
重载地址的结果时,请使用它。
仅限我的意见:
除非你是设计类及其接口的团队的一员,否则永远不要。就我个人而言,我从来没有看到过让那个操作员过载的好理由。但是,如果有人设计了一个有意义的类,并假设该类是供公众使用的(也就是说,该类不是仅在特定库中内部使用的),我会期望该类在正常代码中工作,自然地期望&
的意思是"的地址"。如果重载运算符的类没有以合理的方式设计,那么我就不会使用那个类,句号。因为要么该类已损坏,要么它不打算在它所属的库之外使用。
毕竟,它们都返回对象的"地址",那么我什么时候使用哪个呢?
你绝对不能保证重载的operator&
是对象的"地址",很可能不是,或者类作者可能不会费心重载它。他们可以重载它以返回不同的类型,或者如果他们不小心试图阻止人们获取它的地址,甚至可以返回void
。
如果您想要一个指向可能重载了&
的对象的指针(例如,因为它的类型是一个模板参数,所以您不知道),那么使用std::addressof
或文档说明您的模板不支持不将对象的真实地址返回为正确类型的类型。
- 何时在引用或唯一指针上使用移动语义
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 何时提供默认参数作为模板参数
- 如何在全屏模式下(在OpenGL中)使背景透明
- 找到两对数字,使它们的乘积的绝对差最小化
- C++:如何使函数只返回作为列表一部分的字符串
- C++-明确何时以及如何调用析构函数
- c++使用foreach使数组为null
- 使外部项目可用于find_package CMake
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 是否可以在C++中使变量真正只读
- 有可能使shared_ptr协变吗
- 使lambda不可复制/不可移动
- 何时使函数成为类成员函数C++?
- 何时必须使操作员<<过载?
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- Apple C++ LLVM Compiler 4.x & UNICODE:何时需要?UNICODE 是默认编译器字符集吗?使代码同时编译 ANSI 和 UNICODE 版本
- 如何使libcurl c++调用超时和/或知道调用中何时发生超时
- 何时使用 addressof(x) 而不是 &x?