繁体   English   中英

为什么我们允许使用不完整类型的地址?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM