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