Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
* имя функции-члена;
* имя переменной;
* имя типа или
* имя объявления функции с областью видимости блока(1).
ADL также запрещен, если имя вызываемой функции заключено в круглые скобки.
В противном случае, если после имени следует заключенный в круглые скобки список
выражений аргументов, ADL выполняется путем поиска имени в пространствах имен и
классах, “связанных” или “ассоциированных” с типами аргументов вызова.
Если вы передаете в функции аргумент типа класса(в нашем случае это "x" типа A::X),
то при поиске имен(в нашем случае это имя функции) компилятор помимо прочих
рассматривает имена в пространстве имен содержащем тип аргумента. Работает только
при неквалифицированном поиске имен.
При поиске имени функции, указанного в выражении вызова функции, компилятор также
будет проверять пространства имен, содержащие типы аргументов вызова функции.
Например:
namespace TestScope
{
struct TestStruct
{
int value;
};
int main()
{
using ::foo;
TestScope::TestStruct ts;
foo(ts);
return 0;
}
OUT: ERROR!!!
In function 'int main()':
23:7: error: call of overloaded 'foo(TestScope::TestStruct&)' is ambiguous
23:7: note: candidates are:
16:6: note: void foo(TestScope::TestStruct&)
12:8: note: void TestScope::foo(TestScope::TestStruct&)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include <iostream>
namespace TestScope
{
struct TestStruct
{
int value;
};
int main()
{
void foo(TestScope::TestStruct& ts);
TestScope::TestStruct ts;
foo(ts);
return 0;
}
OUT: 1
Ссылки:
* https://habr.com/ru/company/jugru/blog/447900/
* https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA,_
%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%8F%D1%89%D0%B8%D0%B9_%D0%BE%D1%82_
%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2