【发布时间】:2018-09-12 11:08:00
【问题描述】:
下面的代码在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) 是不完整的类型是可以的。
【问题讨论】:
-
实现定义或未定义的行为取决于 C++ 版本参见en.cppreference.com/w/cpp/language/operators
-
@RichardCritten 未指定或未定义的行为,具体取决于 C++ 版本。这在 cppreference 上被歪曲了。如果您向下滚动到同一页面上的“缺陷报告”部分,它会在那里正确列出。而且它必须是未指定的,而不是实现定义的:对于执行整个程序分析的实现,期望它们准确记录完整类型(包括重载运算符)何时可见和不可见是不合理的。
标签: c++ c++11 operator-overloading incomplete-type addressof