C++
Поиск зависимого имени аргумента
Поиск…
Какие функции найдены
Функции обнаруживаются путем первого сбора набора «связанных классов» и «связанных пространств имен», которые включают в себя одну или несколько из следующих, в зависимости от типа аргумента T
Во-первых, давайте покажем правила для имен классов, перечислений и классов.
- Если
T
- вложенный класс, перечисление участника, то его окружающий класс. - Если
T
- перечисление (оно также может быть членом класса!), Самое внутреннее пространство имён. - Если
T
- класс (он также может быть вложен!), Все его базовые классы и сам класс. Самое внутреннее пространство имен всех связанных классов. - Если
T
являетсяClassTemplate<TemplateArguments>
(это также класс!), Классы и пространства имен, связанные с аргументами типа шаблона, пространство имен любого аргумента шаблона шаблона и окружающий класс любого аргумента шаблона шаблона, если аргумент шаблона шаблон участника.
Теперь есть несколько правил для встроенных типов
- Если
T
- указатель наU
или массивU
, классы и пространства имен, связанные сU
Пример:void (*fptr)(A); f(fptr);
, включает пространства имен и классы, связанные сvoid(A)
(см. следующее правило). - Если
T
- это тип функции, классы и пространства имен связаны с параметрами и типами возврата. Пример:void(A)
будет включать пространства имен и классы, связанные сA
- Если
T
является указателем на член, классы и пространства имен, связанные с типом члена (могут применяться как к указателю на функции-члену, так и указателю на элемент данных!). Пример:BA::*p; void (A::*pf)(B); f(p); f(pf);
включает пространства имен и классы, связанные сA
,B
,void(B)
(который применяет маркер выше для типов функций).
Все функции и шаблоны во всех связанных пространствах имен находятся путем поиска зависимых от аргументов. Кроме того, найдены функции имени пространства-области видимости в ассоциированных классах , которые обычно не видны. Однако использование директив игнорируется.
Все следующие примерные вызовы действительны, не определяя f
именем имени в вызове.
namespace A {
struct Z { };
namespace I { void g(Z); }
using namespace I;
struct X { struct Y { }; friend void f(Y) { } };
void f(X p) { }
void f(std::shared_ptr<X> p) { }
}
// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());
g(A::Z()); // invalid: "using namespace I;" is ignored!
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow