[英]Class declaration within a function declaration
請考慮以下示例:
#include <iostream>
void foo(class B, B *b);
B *c; //OK
int main(){ }
標准N4296::3.3.2/7.1 [basic.scope.pdecl]
- 申請表格
class-key attribute-specifier-seqopt identifier;
標識符聲明為包含聲明的作用域中的類名
,但根據N4296:3.3.4/1 [basic.scope.proto]
在函數聲明中,或除函數定義(8.4)的聲明符之外的任何函數聲明符中,參數名稱(如果提供)具有函數原型作用域,該作用域終止於最近的封閉函數聲明符的末尾。
因此,應該在函數原型范圍中引入class B
。 B
的范圍應該在foo
的聲明者的最后。 但該名稱在全球范圍內可見。 為什么?
您在3.3.2 [basic.scope.pdecl] / p7中引用了錯誤的項目符號。 foo
聲明中的class B
不是class-key attribute-specifier-seq_opt identifier;
- 沒有分號。
相反,第二個子彈適用:
對於表單的詳細類型說明符
類密鑰標識符
如果在命名空間作用域中定義的函數的decl-specifier-seq或parameter-declaration-clause中使用了elaborated-type-specifier,則在包含聲明的命名空間中將標識符聲明為類名 。 否則,除了作為友元聲明之外,標識符在包含聲明的最小命名空間或塊范圍中聲明。
因此, 闡述類型說明符 class B
在你的例子聲明B
中含有的聲明命名空間的類名 foo
-即全局命名空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.