170 похожих чатов

Товарищи, приветствую. Подскажите, где в Стандарте определяется понятие "to bind a

name" (даже контекстно)?

3 ответов

9 просмотров
Sergey-Anisimov Автор вопроса

Цитируемый вопрос вытек из нижеследующего рассуждения, вызванного разбором примера: 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.: Прошу прощения за очередную стену.

Sergey Anisimov
Цитируемый вопрос вытек из нижеследующего рассужде...

а через ADL inline friend находится не через associated namespace, а через https://eel.is/c++draft/basic.lookup.argdep#4.2

Sergey-Anisimov Автор вопроса
Sergey Kaniskin
а через ADL inline friend находится не через assoc...

Это и составляет проблему, благодарю!

Похожие вопросы

Обсуждают сегодня

Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
20
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
.model small .stack 100h .data a db 'Hello, World!', '$' ; исходная строка b db 20 dup(?) ; строка b с запасом на максимальную длину .code main: ...
Алексей -man
3
Или имеется ввиду именно что медленнее работа компилятора?
Куся 🌿⃤ __UKS
9
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
вопрос, кого посмотреть в ютубе или где почитать про указатели чтобы раз и навсегда запомнить зачем они нужны и как правильно ими пользоваться? поделитесь хорошими ресурсами, ...
-
14
let sum = [1, 2, 3].map { String($0) }.flatMap { Int($0) }.reduce(0, +) let sum = [1, 2, 3].map { (num: Int) -> String in String(num) }.flatMap { (str: String) -> Int? in Int...
Yakov
7
Is there a digital way to cut the electricity from a usb in linux? It sounds weird, but it's exactly what I need to do. I tried to simulate the unplug/replug but is not the ...
Eduard Rivas
15
Карта сайта