何时要使用AddressOf(X),而不是&X?(When to use addressof(x)

2019-07-19 17:22发布

如何确定自己是否需要addressof(x)而不是&x拍摄对象的地址是什么时候?


好像这个问题是混乱,所以澄清是为了:

addressof显然绕过超载AddressOf运算符。 我已经意识到这一点。

我想知道的是:
我怎么知道那是我真正想做的事? (特别是一个模板内时等)

是否有某种“规则”的,可以帮助我找出我需要addressof而不是&
毕竟,他们都返回对象“的地址”,所以当我用哪个呢?

Answer 1:

您使用std::addressof时,你必须。 可悲的是,“当你不得不”包括任何时候你在模板代码的工作,并希望把未知类型的变量TT&成为一个诚实神指针变量的内存。

因为C ++委员会愚蠢允许的参考运营商(以小合法目的)的过载,有可能对用户与某些类型的,你不能使用引用操作符来获得一个实际的指针来实例化模板。 std::addressof是解决谁使用这个可疑的C ++功能,以便做什么语言应该保证工作开始与用户的方式。

总之,这是一个愚蠢的语言库修复。 使用它的模板代码,而不是&如果你想确保用户无法破坏你的代码。 如果您的用户可以被信任不使用该IL-设想的功能,那么你可以使用&



Answer 2:

如果它是一个用户定义的类型重载的一元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
}

我知道这是不是安全的。



Answer 3:

我的意见只:

除非你是团队设计类及其接口,从来没有的一部分。 我个人从来没有见过一个很好的理由重载操作。 但是,如果有人设计了一个类,其中很有道理,并假设类是为公共消费(也就是说,该类不是仅供内部使用在特定库),我会期望类的普通代码自然预计, &意为“地址”。 如果重载操作类不是在这样一个合理的方式设计的,那么我就不会使用这个类,周期。 因为无论那个类坏了,或它不意味着它是其中一部分的库外使用。



Answer 4:

当你想知道对象的实际地址,而不是一个地址的结果使用operator&过载。



Answer 5:

毕竟,他们都返回对象“的地址”,所以当我用哪个呢?

你绝对没有保证重载operator&为对象“的地址”,没准它是不是,还是类的作者可能不会打扰超载了。 他们可以超载它返回不同类型,甚至返回void ,如果他们生病,深思熟虑试图阻止人们服用它的地址。

如果你想有一个指针可能已经超载的对象& (例如,因为它的类型是一个模板参数,所以你不知道),那么无论是使用std::addressof或文档模板不支持类型的不返回对象的真实地址为正确的类型。



文章来源: When to use addressof(x) instead of &x?
标签: c++ addressof