【发布时间】:2018-08-28 23:33:30
【问题描述】:
以下代码:
struct X {
X() {}
};
struct Y {
Y() {}
Y(X) {}
Y(int) {}
friend bool operator==(const Y&, const Y&) { return false; }
};
bool f()
{
return 1 == X();
}
编译失败,出现以下错误:
error: no match for 'operator==' (operand types are 'int' and 'X') return 1 == X();
如果我将 operator== 的定义移到类之外,它就可以正常工作:
struct X {
X() {}
};
struct Y {
Y() {}
Y(X) {}
Y(int) {}
friend bool operator==(const Y&, const Y&);
};
inline bool operator==(const Y&, const Y&) { return false; }
bool f()
{
return 1 == X();
}
有人能解释一下为什么吗? (理想情况下,引用标准和人类可读的解释/动机。)在这里的答案中:https://stackoverflow.com/a/20114792/1350936@rightfold 提到了
即使没有 ADL 也可以找到在类之外定义的函数
但我不太明白这是什么意思。
【问题讨论】:
-
是你不明白ADL是什么还是你不明白在那个类之外声明的函数是如何查找的?
-
@0x499602D2 我看不出 ADL 在这里是如何适用的,因为 ADL 是关于在不同的命名空间中寻找函数,但在这种情况下我根本没有任何命名空间。
-
@0x499602D2 我真正要问的是: 1. 这两种情况下的查找规则有什么区别? 2. 为什么有任何区别?
-
我不明白为什么第一种情况应该有效。您是否希望编译器将比较中的操作数转换为任何可能的不相关类型,直到有一个具有匹配的比较运算符?
-
@HenriMenke 第一种情况和第二种情况有什么区别?是的,我希望编译器尝试隐式转换来找到匹配的函数。这正是它在第二种情况下所做的,对吧?
标签: c++ name-lookup