следующий код:
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
Но я не совсем понимаю, что это значит.