为什么一元运算符&不需要完整的类型?

时间:2018-04-03 07:39:29

标签: c++ c++11 operator-overloading incomplete-type addressof

以下代码可以使用gcc 7.2.0clang 6.0.0编译好。

#include <iostream>

struct stru;

void func(stru& s) {
  std::cout << &s << std::endl;
}

int main() {

}

我想知道这是怎么回事。如果stru重载operator&()怎么办?编译器不应该仅仅使用struct stru这样的前向声明来说明。在我看来,只有std::addressof(s)可以使用不完整的类型。

1 个答案:

答案 0 :(得分:9)

  

如果stru超载operator&()会怎样?

然后未指定是否会调用重载(请参阅Oliv对标准引用的注释)。

  

一元运算符&amp;不需要完整的类型?

这就是标准定义语言的方式。内置的address-of运算符不需要知道类型的定义,因为这对获取对象地址的位置没有影响。

考虑为什么它是一件好事:与C的兼容性。