Точка из iso С++ n3290: поиск имени, зависящий от аргумента:

Пункт из 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 годом, он добавил 3-й пункт. может ли кто-нибудь объяснить, как это возможно ... пояснить на примере .... (перегружено)..

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


person user751747    schedule 28.07.2011    source источник


Ответы (1)


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

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

namespace n {
    class c { ... };
    class e { ... } f;
}

namespace o {
    class d { ... };
    void f(c &, d &) { ... };
    void f(c &, d &, bool) { ... };
}

namespace p {
    f(c(), d());
}

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

person Jan Hudec    schedule 28.07.2011