Добрый день.
Подскажите место в стандарте, где разъясняется следующее поведение:
#include <iostream>
using namespace std;
class A {
int i_ = 555;
friend void f0(A& a) {
cout << a.i_ << endl;
}
friend void f1() {
A a;
cout << a.i_ << endl;
}
};
// Если не указать эту строку,
// то дальнейший вызов f1() не удастся
void f1();
int main() {
A a;
f0(a);
// Здесь будет ошибка, если выше
// нет объявления f1() вне класса
f1();
return 0;
}
UPD0
Нашел ответ.
В книге Язык программирования C++ Специальное издание (Бьерн Страуструп)
11.5.1. Поиск друзей
...
Дружественная функция может явно объявляться таким же образом, что и дружественный класс; или же ее можно искать по типу аргументов (§8.2.6) даже в случае, когда она объявлена вовсе не в самой близкой из охватывающих областей видимости.
Например:
void f(Matrix& m) {
invert(m); // invert() - друг класса Matrix
}
...
8.2.6. Поиск имен
Чаще всего функция с аргументом типа Т определяется в том же пространстве имен, что и тип Т. Поэтому, если функцию не удается найти в контексте, где она используется, поиск продолжается в пространстве имен ее аргументов.
Например:
namespace Chrono {
class Date{ /*...*/};
boot operator==(const Date&, const std::string&);
std::string format(const Date&); // выдать строковое представление
// ...
}
void f(Chrono::Date d, int i) {
std::string s = format(d); // Chrono::format()
std::string t = format(i); // error: нет format() в области видимости
}