考虑这段代码:
class Addressable;
class Class1 { void foo(Addressable &a) { (void) &a; } }; // OK
class Addressable { void *operator &() { return this; } };
class Class2 { void foo(Addressable &a) { (void) &a; } }; // Error: operator & private
为什么 C++ 允许获取不完整引用类型的地址?
如上所示,这难道不是潜在的非法行为吗?这是故意的吗?
是的,这是故意的,如果operator&
是否超载是已知的。
早在 C++ 出现之前,获取不完整类型的地址就已经成为可能。在C中,绝对不存在任何破损的风险,因为&
不能超载。
C++ 选择不不必要地破坏以前有效的程序,并简单地指定如果不完整的类型确实具有重载&
运算符,未指定是否使用重载运算符。
引用N4140:
5.3.1 一元运算符 [expr.unary.op]
If &
应用于不完整类类型的左值并且完整类型声明operator&()
,未指定运算符是否具有内置含义或调用运算符函数。
这可以解释为甚至适用于当前正在声明的类,甚至当声明operator&
已经看到了:
extern struct A a;
struct A {
int operator&();
decltype(&a) m; // int, or A *?
};
int main() {
return A().m; // only valid if m is int
}
在这里,GCC 给出m
type A *
并拒绝该程序,但 clang 给出了它的类型int
并接受它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)