簡體   English   中英

函數聲明中的類聲明

[英]Class declaration within a function declaration

請考慮以下示例:

#include <iostream>

void foo(class B, B *b); 

B *c; //OK

int main(){ }

DEMO

標准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-seqparameter-declaration-clause中使用了elaborated-type-specifier,則在包含聲明的命名空間中將標識符聲明為類名 否則,除了作為友元聲明之外,標識符在包含聲明的最小命名空間或塊范圍中聲明。

因此, 闡述類型說明符 class B在你的例子聲明B中含有的聲明命名空間的類名 foo -即全局命名空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM