以下代码可以使用gcc 7.2.0和clang 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)
可以使用不完整的类型。
答案 0 :(得分:9)
如果
stru
超载operator&()
会怎样?
然后未指定是否会调用重载(请参阅Oliv对标准引用的注释)。
一元运算符&amp;不需要完整的类型?
这就是标准定义语言的方式。内置的address-of运算符不需要知道类型的定义,因为这对获取对象地址的位置没有影响。
考虑为什么它是一件好事:与C的兼容性。