何时使用 addressof(x) 而不是 &x?

When to use addressof(x) instead of &x?

本文关键字:addressof 何时使      更新时间:2023-10-16

获取对象地址时,如何决定是否需要addressof(x)而不是&x


这个问题似乎令人困惑,因此需要澄清:

addressof显然绕过了运算符的过载地址我已经意识到了

我想知道的是:
我怎么知道这是否是我真正想做的?(尤其是在模板内等)

是否有某种"规则"可以帮助我确定何时需要addressof而不是&
毕竟,它们都返回对象的"地址",那么我什么时候使用哪个呢?

当你必须使用std::addressof时。遗憾的是,"当你必须"包括了你在模板代码中工作并希望将未知类型TT&的变量变成指向该变量内存的诚实指针的任何时候。

因为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或文档说明您的模板不支持不将对象的真实地址返回为正确类型的类型。