Поиск…


Какие функции найдены

Функции обнаруживаются путем первого сбора набора «связанных классов» и «связанных пространств имен», которые включают в себя одну или несколько из следующих, в зависимости от типа аргумента 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