Точка из ISO C ++ n3290: Аргумент-зависимый поиск имени: - PullRequest
1 голос
/ 28 июля 2011

Точка из iso C ++ n3290: Аргумент-зависимый поиск имени: раздел 3.4.2, пункт 4

When considering an associated namespace, the lookup is the same as the lookup
performed when the associated namespace is used as a qualifier (3.4.3.2) except
 that:
 — Any using-directives in the associated namespace are ignored.
 — Any namespace-scope friend functions or **friend function templates** declared
   in associated classes are visible within their respective namespaces even if 
   they are not visible during an ordinary lookup (11.3).
 — All names except those of(possibly overloaded) functions and function 
    templates are ignored.

Здесь, если сравнивать с более ранним стандартом 2003 года, он добавил третий пункт. Может ли кто-нибудь объяснить, как это возможно ... Expalin на примере .... (перегружен) ..

И он также сказал, что во втором пункте он включил шаблоны функций друзей (я знаю функции друзей noraml calss). Может кто-нибудь объяснить, что это шоу, это насыщение.

1 Ответ

2 голосов
/ 28 июля 2011

Я думаю, что поиск всегда должен был работать именно так и был скорее разъяснением, чем реальным изменением. Я не уверен, было ли это добавлено, потому что в другом месте была добавлена ​​какая-то другая формулировка, которая требует, чтобы сделать это более ясной, компиляторы фактически отличались в некоторых угловых случаях, или кто-то спросил, что является правильной реализацией.

Точка объявления 2. Подобно тому, как вы можете объявить, что функция f является другом класса c, вы также можете объявить, что шаблон функции t является другом класса c. Объявление отличается, потому что оно явно упоминает аргументы шаблона, поэтому они чувствовали необходимость явного применения обоих случаев.

template <typename T> bool f(T);
class c {
    friend bool f<c>(c); // only particular instantiation is friend
    template <typename T> friend bool f<T>(T); // all instantiations are friends
}

(конечно, вы можете комбинировать это с c как с самим шаблоном для неограниченного удовольствия).

Точка объявления 3. Предложение означает, что если искать функцию f в пространстве имен n, содержащем класс f, то класс f не рассматривается (в то время как если вы напишите n :: f, он займет этот класс). «Возможно, перегружен» на самом деле не должно быть там. Функции всегда могут быть перегружены, и все перегрузки, обнаруженные во всех пространствах имен, будут включены в окончательное разрешение перегрузки.

* * 1010

Связанные пространства имен f(c(), d()) являются n и o. Однако n::f - это не функция, а (возможно, функтор) экземпляр, поэтому он не рассматривается (в то время как старая формулировка допускала рассмотрение f operator()). o::f перегружен, учитываются все перегрузки (и, после сбора всех возможных значений f, вариант с 3 аргументами исключается, поскольку даны только 2 аргумента).

...