Рассмотрим:Разница между друзьями, определенными в классе и снаружи: ошибка или функция?
struct Y {
Y(float f) : f(f) {}
float f;
};
struct X {
X(Y y) : i(y.f) {}
int i;
friend bool operator==(X x1, X x2) {
return x1.i == x2.i;
}
};
int main()
{
return Y(1) == Y(2); // ERROR
}
Это вызывает следующую ошибку на MSVC и похожий один на Clang:
'==': candidate function(s) not accessible
could be the friend function at '..\main.cpp(11)' : '==' [may be found via argument-dependent lookup]
Если я двигаю определение функции друг из класса:
struct X {
X(Y y) : i(y.f) {}
int i;
friend bool operator==(X x1, X x2);
};
inline bool operator==(X x1, X x2)
{
return x1.i == x2.i;
}
Выражение в main()
выше компилируется отлично.
Является ли это обязательным стандартом или ошибкой? Если это предусмотрено: почему?
Обнаружено обман слишком поздно –