[英]Why are we allowed to take the address of an incomplete type?
考虑以下代码:
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]
如果将
&
应用于不完整类类型的左值,并且完整类型声明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
类型A *
并拒绝该程序,但是clang给它给类型int
并接受它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.