Я думаю, что поиск всегда должен был работать именно так и был скорее разъяснением, чем реальным изменением. Я не уверен, было ли это добавлено, потому что в другом месте была добавлена какая-то другая формулировка, которая требует, чтобы сделать это более ясной, компиляторы фактически отличались в некоторых угловых случаях, или кто-то спросил, что является правильной реализацией.
Точка объявления 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 аргумента).