12

以下代码在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)不完整的类型才可以。

4

1 回答 1

9

如果stru超载了operator&()怎么办?

然后未指定是否将调用重载(有关标准报价,请参见 Oliv 的评论)。

一元运算符 & 怎么可能不需要完整的类型?

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

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

于 2018-04-03T07:59:45.123 回答