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

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


似乎这个问题很混乱,所以澄清是为了:

addressof显然绕过了重载地址的运算符。 我已经意识到这一点。

我想知道的是:
我怎么知道这是我真正想做的事情? (特别是在模板内等)

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

必要时使用std::addressof 。 可悲的是,“当你必须”包括任何时候你正在使用模板代码,并且想把一个未知types的variablesTT&变成一个诚实的上帝指向该variables的内存。

由于C ++委员会愚蠢地允许引用操作符的重载(很less合法的目的),用户可以使用某种types实例化模板,而不能使用引用操作符来获取实际的指针。 std::addressof是一种解决使用这个可疑的C ++特性的用户的方法,以便执行该语言应该保证的工作。

总之,这是一个语言愚蠢的图书馆修复。 如果您想确保用户不能破坏您的代码,请在模板代码中使用它,而不要使用它。 如果你的用户可以信任不使用这个il-conceivedfunction,那么你可以使用&

如果它是一个带有一元运算operator&重载的用户定义types,并且你想要它的地址,则使用addressof

我会说,你应该总是使用&因为如你所说,如果你不这样做,它会击败过载的目的。 当然, 除非你对超负荷做了一些有意义的事情,在这种情况下,你需要解决(在课堂之外,你可以使用this ),但你必须非常确定你在做什么。

这里还有更多 – 如果你想重载operator&类外(你可以),你必须使用addressof返回地址,否则会导致无限recursion:

 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 } 

我知道这是不安全的。

我的意见只:

除非你是deviseclass级和接口的团队的一部分,否则绝不会。 我个人从来没有看到一个很好的理由,超载运营商。 但是,如果有人devise了一个有意义的类,并且假定这个类是为了公共消费的(也就是说,这个类不是只在某个特定的图书馆内部使用的话),我会期望这个类以正常的代码工作自然期望&手段“的地址”。 如果重载操作符的类不是以一种合理的方式devise的,那么我就不会使用这个类。 因为这个课程不pipe是打破了,还是不打算在它所属的图书馆之外使用。

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

毕竟,他们都返回对象的“地址”,那么我什么时候使用哪个?

你绝对不能保证一个重载的operator&是对象的“地址”,有可能不是,或者类作者可能不会费心去重载它。 他们可能已经超负荷返回一个不同的types,或者如果他们不情愿地试图阻止人们采取地址,它甚至会void

如果你想要一个指向可能重载的对象的指针(例如,因为它的types是一个模板参数,所以你不知道),那么要么使用std::addressof要么文档说你的模板不支持不需要的types返回对象的真实地址作为正确的types。