【发布时间】:2020-02-03 02:57:20
【问题描述】:
在以下代码中:
void overload() {}
struct Struct {
void overload(int arg1) {}
void member() {
overload(1); //compiles
overload(); //error: too few arguments [...] did you mean '::overloaded'?
}
};
如果我将struct 更改为namespace,我会得到类似的结果,只是错误消息略有不同。
当有同名的成员函数时,为什么编译器不能通过运算符重载选择非成员函数?
作为参考,以下所有情况均按预期工作:
- 从一个非成员中选择两个非成员(显然)
- 在成员中的两个成员之间进行选择
- 在成员中的两个非成员之间进行选择
【问题讨论】:
-
简短的回答是因为这就是 C++ 的工作方式。重载解析的查找规则是结构化和严格的。逐步尝试每个范围。当在一个范围内找到匹配的符号时,就会发生重载决议。如果重载解析失败,则代码格式错误,并且不会继续查找。 ADL 引入了一些错综复杂的内容,但这是一个简单的总结。也许有人可以提供标准中相关引用的摘要......但这就是 C++ 的工作原理,仅此而已。
-
这样编写标准是否有实际原因,还是只是语言设计疏忽?
-
将
using ::overload;放入member。这是一个有意的决定,如果您碰巧在此之前包含一些其他标头,您不希望member()的行为发生变化
标签: c++ overloading