函数参数的声明区域

6 c++ templates language-lawyer

我们有以下示例N4296::3.3.9/2 [basic.scope.temp]:

namespace N {
    template<class T> struct A { };                 // #1
    template<class U> void f(U) { }                 // #2
    struct B 
    {
        template<class V> friend int g(struct C*);  // #3
    };
}
Run Code Online (Sandbox Code Playgroud)

的声明区T,U并且V模板声明上线S #1,#2#3分别.但名称A,f,g并且C都属于同一个声明区域-即名称空间结构体N.

这不是很清楚,我为什么N身体是声明区gC.我以为是班级B的身体.
有人可以澄清标准的含义吗?

Col*_*mbo 4

C首先在 中声明g,因此 [basic.scope.pdecl]/(7.2) 适用

\n\n
\n

对于形式的详细类型说明符

\n\n

         类键\n 标识符

\n\n

如果在命名空间范围内定义的函数的 decl-specifier-seq 或参数声明子句中使用详细类型说明符,则 [\xe2\ x80 \ xa6 ]否则,除了作为友元声明之外,标识符在包含该声明的最小命名空间或块作用域中声明。

\n
\n\n

(“otherwise \xe2\x80\xa6”部分仅适用于形式的声明friend class C;;它使用“as”而不是“inside”)
\n因此 asC被声明为 的成员N,显然它的声明区域是N\ 的主体。其实外面也可以用CB

\n\n

并且是根据 [namespace.memdef]/3g的成员N

\n\n
\n

如果非本地类中的友元声明首先声明了一个 [..]\n 函数模板,则该友元是最内层封闭\n 命名空间的成员。

\n
\n\n

因此 的声明区域g也是N\ 的主体。

\n