在获取对象的地址时,如何确定是否需要addressof(x)
而不是&x
?
似乎这个问题很混乱,所以要澄清一下:
addressof
显然绕过了重载的address-of运算符。 我已经意识到了这一点。
我想知道的是:
我怎么知道这是不是我真的想做什么? (特别是在模板内部等)
是否有某种“规则”可以帮助我确定何时需要addressof
代替&
?
毕竟,他们都返回对象的“地址”,那么我什么时候使用哪个?
答案 0 :(得分:73)
必要时使用std::addressof
。遗憾的是,“当你必须”时,你可以随时使用模板代码,并希望将未知类型T
或T&
的变量转换为指向该变量内存的诚实指针。< / p>
因为C ++委员会愚蠢地允许引用运算符的重载(为了很少的合法目的),用户可以使用某种类型实例化您的模板,您不能使用引用运算符来获取实际的指针。 std::addressof
是一种解决使用这种可疑C ++功能的用户的方法,以便完成该语言应该保证开始工作的内容。
简而言之,它是针对语言愚蠢的库修复。如果您想确保用户不会破坏您的代码,请在模板代码而不是&
中使用它。如果您的用户可以信任不使用此设想,那么您可以使用&
。
答案 1 :(得分:8)
如果它是用户定义的类型,并且您需要其地址,请使用operator&
。
我会说你应该总是使用addressof
,因为正如你所说,如果你不这样做,它就会超越过载的目的。 除非当然你对重载做了一些有意义的事情,在这种情况下你需要&
(在课外,你可以只使用addressof
),但你有要确定你在做什么。
还有更多 - 如果你想在课堂外重载this
(你可以),你必须使用operator&
来返回地址,否则会导致无限递归:
addressof
我知道这不安全。
答案 2 :(得分:6)
当您想知道对象的实际地址时使用它,而不是operator&
重载地址的结果。
答案 3 :(得分:6)
仅我的意见:
除非您是设计课程及其界面的团队成员,否则永远不会。我个人从来没有看到过重运算符的充分理由。但是如果有人设计了一个有意义的类,并假设该类是为了公共消费(也就是说,该类不仅仅是在特定的库中内部使用),我希望该类能够在普通代码中工作自然希望&
表示“地址”。如果重载运算符的类不是以这种合理的方式设计的,那么我就不会使用那个类,句点。因为该类被破坏了,或者它不打算在它所属的库之外使用。
答案 4 :(得分:5)
毕竟,他们都返回对象的“地址”,那么我什么时候使用哪个?
你绝对不能保证重载operator&
是对象的“地址”,很可能不是,或者类作者可能不会因为超载它而烦恼。如果他们不明智地试图阻止人们取其地址,他们可能会超载它以返回不同类型,甚至返回void
。
如果你想要一个指向可能重载&
的对象的指针(例如,因为它的类型是模板参数,所以你不知道),那么使用{{1}或者记录您的模板不支持不将对象的真实地址作为正确类型返回的类型。