如何确定自己是否需要addressof(x)
而不是&x
拍摄对象的地址是什么时候?
好像这个问题是混乱,所以澄清是为了:
addressof
显然绕过超载AddressOf运算符。 我已经意识到这一点。
我想知道的是:
我怎么知道那是我真正想做的事? (特别是一个模板内时等)
是否有某种“规则”的,可以帮助我找出我需要addressof
而不是&
?
毕竟,他们都返回对象“的地址”,所以当我用哪个呢?
如何确定自己是否需要addressof(x)
而不是&x
拍摄对象的地址是什么时候?
好像这个问题是混乱,所以澄清是为了:
addressof
显然绕过超载AddressOf运算符。 我已经意识到这一点。
我想知道的是:
我怎么知道那是我真正想做的事? (特别是一个模板内时等)
是否有某种“规则”的,可以帮助我找出我需要addressof
而不是&
?
毕竟,他们都返回对象“的地址”,所以当我用哪个呢?
您使用std::addressof
时,你必须。 可悲的是,“当你不得不”包括任何时候你在模板代码的工作,并希望把未知类型的变量T
或T&
成为一个诚实神指针变量的内存。
因为C ++委员会愚蠢允许的参考运营商(以小合法目的)的过载,有可能对用户与某些类型的,你不能使用引用操作符来获得一个实际的指针来实例化模板。 std::addressof
是解决谁使用这个可疑的C ++功能,以便做什么语言应该保证工作开始与用户的方式。
总之,这是一个愚蠢的语言库修复。 使用它的模板代码,而不是&
如果你想确保用户无法破坏你的代码。 如果您的用户可以被信任不使用该IL-设想的功能,那么你可以使用&
。
如果它是一个用户定义的类型重载的一元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
或文档模板不支持类型的不返回对象的真实地址为正确的类型。