【问题标题】:Why does unary operator & not require a complete type?为什么一元运算符 & 不需要完整的类型?
【发布时间】:2018-09-12 11:08:00
【问题描述】:

下面的代码在gcc 7.2.0clang 6.0.0 下都能正常编译。

#include <iostream>

struct stru;

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

int main() {

}

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

【问题讨论】:

  • 实现定义或未定义的行为取决于 C++ 版本参见en.cppreference.com/w/cpp/language/operators
  • @RichardCritten 未指定或未定义的行为,具体取决于 C++ 版本。这在 cppreference 上被歪曲了。如果您向下滚动到同一页面上的“缺陷报告”部分,它会在那里正确列出。而且它必须是未指定的,而不是实现定义的:对于执行整个程序分析的实现,期望它们准确记录完整类型(包括重载运算符)何时可见和不可见是不合理的。

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


【解决方案1】:

如果stru 过载了operator&amp;() 怎么办?

然后是否会调用重载是未指定的(标准引用见 Oliv 的评论)。

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

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

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

【讨论】:

  • [expr.unary]/5 如果&应用于不完整类类型的左值,并且完整类型声明了operator&(),则未指定该操作符是否具有内置含义或调用操作符函数。[...]
  • @Oliv 感谢您的报价。我更改了措辞以使其准确。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多