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