Я нашел об этом на википедия :
структурная область действия T (которая может использоваться для поиска функций-друзей)
Может кто-нибудь объяснить, что это? Гугл не сильно помог.
Поскольку в нем упоминается поиск друзей, в данном случае «структурная область» относится к области класса. T
(когда T
это класс) или область охвата класса (когда T
тип члена, объявленный внутри класса). Формулировка всего этого абзаца звучит довольно странно, поскольку язык C ++ формально не относится к типам классов как «типам структуры» и формально не определяет «структурную область». Вдобавок ко всему, кажется, что область видимости класса называется «пространством имен», что неверно.
Говоря о друзьях, это, очевидно, подразумевает такие ситуации, как
struct T {
friend void foo(T) {}
};
int main() {
T t;
foo(t);
}
или же
struct T {
enum E { A };
friend void foo(E) {}
};
int main() {
T::E e = T::A;
foo(e);
}
В этих случаях звонки foo
в main
возможно разрешить только потому, что ADL проверяет область действия класса T
и явно ищет функции друзей там. Без ADL, foo
будет невидимым для main
,
Других решений пока нет …