1

来自 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朋友功能)..任何人都可以解释一下,这就是那个satatement。

4

1 回答 1

2

我认为查找应该一直这样工作,并且更多的是澄清而不是实际更改。我不确定是否添加了它,因为在其他地方添加了一些其他措辞需要使这一点更清楚,编译器实际上在某些极端情况下有所不同,或者有些人质疑什么是正确的实现。

广告点 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());
}

Associated namespace of f(c(), d()) are both n and o. However n::f is not a function, but a (possibly functor) instance, so it's not considered (while the old wording allowed considering f's operator()). o::f is overloaded, all overloads are considered (and, after gathering all possible meanings of f, the 3-argument variant is ruled out because only 2 arguments are given).

于 2011-07-28T09:47:02.803 回答