В своем недавнем блоге Энтони Уильямс рассказывает о скрытых друзьях.Основная идея, если я правильно понял, заключается в том, что функции, объявленные друзьями, не могут быть найдены ADL в определенных ситуациях.Простой пример:
namespace N {
struct A {
friend void foo(A) { }
};
struct B {
operator A();
};
// (*)
void bar(A) { }
}
void func() {
N::A a;
bar(a); // OK, bar is found via ADL
foo(a); // OK, foo is found via ADL
N::B b;
bar(b); // OK, bar is found via ADL
foo(b); // NOT OK, foo cannot be found
}
Во всех примерах в посте блога функции друзей определены внутри классов.Можно ли объявить функцию друга и затем определить ее позже в точке (*)
, чтобы она оставалась скрытой?Похоже, что скрытые друзья могут быть определены только в области видимости класса (или в другом модуле компиляции).