Читая Карлссона Вне стандарта C ++ , автор определил функцию друга intrusive_ptr_add_ref в теле class reference_counting (см. Стр. 36). Эта функция вызывается автоматически с использованием Argument Dependent Lookup в нужный момент.
Никогда не видя функции друзей, определенные в теле класса, я поиграл и обнаружил, что gcc 4.4.3 требует предварительного объявления, если не используется поиск ADL. На самом деле, кажется, что нет никакого способа сослаться на adl_no без этой предварительной декларации. Это часть стандарта C ++ или артефакт gcc? (У меня нет окна Windows, поэтому я не могу попробовать VC).
#include <cstdlib>
#include <iostream>
namespace {
void adl_no(); // Remove this and it won't compile with gcc
struct Q {
friend void adl_yes(const Q&) {
std::cout << "adl_yes" << std::endl;
}
friend void adl_no() {
std::cout << "adl_NO" << std::endl;
}
};
}
int main(int argc, char** argv)
{
adl_yes(Q());
adl_no();
return EXIT_SUCCESS;
}