name" (даже контекстно)?
Цитируемый вопрос вытек из нижеследующего рассуждения, вызванного разбором примера: namespace WF { struct S { friend void sub ( S ) { } }; } namespace IF { struct S1 { }; struct S2 { friend void sub ( S1 ) { } }; } /* ... */ sub(WF::S{}); /* WF */ sub(IF::S1{}); /* IF */ (WF - объявление нашлось; IF - соответственно, нет) 0. Допустим, что представленные friend-declaration работает как если бы объявление принадлежало innermost enclosing namespace, как заявляется на cppref: > A name first declared in a friend declaration within a class or class template X becomes a member of the innermost enclosing namespace of X, but is not visible for lookup (except argument-dependent lookup that considers X) 1. В обоих случаях место имеет ADL: вызов функции через unqual-id в условиях отсутствия первично подходящих объявлений. 2. Для единственного типа аргумента в каждом случае собирается множество associated entities, состоящее из одного элемента - самих классов (::WF::S и ::IF::S1 соответственно). 3. В обоих же случаях для этих классов поиск осуществляется в associated namespaces: ::WF и ::IF соответственно. Так поиск оказался бы эквивалентно успешен. 4. Тем не менее, неодинаковость результатов заставляет предположить ложность пункта 0. 5. Для правила об определении принадлежности объявления некоторой области видимости предусмотрены исключения, причем для friend-объявлений отдельно обозначается "do not bind names" (предположительно к области видимости, откуда и исходный вопрос: значимость факта не ясна). То же указывается в интерпретации friend-деклараторов, при этом отмечается, что такие объявления в рассматриваемом случае закрепляются за областью видимости наиболее вложенного пространства имен (что, видимо, и резюмируется в цитате с cppref из пункта 0). 6. Наконец, каких-либо иных уточнений, кроме принципиальной допустимости определения функций в контексте friend-declaration, я не нашел. Вопрос: Где в вышеприведенном рассуждении ошибка/упущение, что допускает наблюдаемое различие в поведении? P.S.: Прошу прощения за очередную стену.
а через ADL inline friend находится не через associated namespace, а через https://eel.is/c++draft/basic.lookup.argdep#4.2
Это и составляет проблему, благодарю!
Обсуждают сегодня