6 c++ templates language-lawyer
我们有以下示例N4296::3.3.9/2 [basic.scope.temp]:
Run Code Online (Sandbox Code Playgroud)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 }; }的声明区
T,U并且V是模板声明上线S#1,#2和#3分别.但名称A,f,g并且C都属于同一个声明区域-即名称空间结构体的N.
这不是很清楚,我为什么N身体是声明区g和C.我以为是班级B的身体.
有人可以澄清标准的含义吗?
C首先在 中声明g,因此 [basic.scope.pdecl]/(7.2) 适用
\n\n\n对于形式的详细类型说明符
\n\n类键\n 标识符
\n\n如果在命名空间范围内定义的函数的 decl-specifier-seq 或参数声明子句中使用详细类型说明符,则 [\xe2\ x80 \ xa6 ];否则,除了作为友元声明之外,标识符在包含该声明的最小命名空间或块作用域中声明。
\n
(“otherwise \xe2\x80\xa6”部分仅适用于形式的声明friend class C;;它使用“as”而不是“inside”)
\n因此 asC被声明为 的成员N,显然它的声明区域是N\ 的主体。其实外面也可以用CB。
并且是根据 [namespace.memdef]/3g的成员N
\n\n\n如果非本地类中的友元声明首先声明了一个 [..]\n 函数模板,则该友元是最内层封闭\n 命名空间的成员。
\n
因此 的声明区域g也是N\ 的主体。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |