簡體   English   中英

C ++聲明中的顯式限定

[英]explicit qualification in C++ declaration

當第一個聲明被注釋掉時,以下命名空間定義無法編譯。 如果foo的第一個聲明被取消注釋,那么它編譯得很好。

namespace Y
{
    //void foo();
    void ::Y::foo(){}
}

標准中的相關部分(§8.3¶1)說:

當declarator-id被限定時,聲明應引用先前聲明的成員

據我所知,此規則可防止將名稱引入其他名稱空間。 我想知道是否可以放寬該規則以允許引用當前命名空間的qualified-id

CWG#482是相關的:

根據8.3 [dcl.meaning]第1段,[...]
此限制禁止以下示例:

 void f(); void ::f(); // error: qualified declarator namespace N { void f(); void N::f() { } // error: qualified declarator } 

似乎沒有任何充分的理由不允許這樣的聲明,並且許多實現接受它們,盡管標准禁止。 是否應該更改標准以允許它們?

2006年4月會議記錄:

在討論問題548時 ,CWG同意應刪除在其名稱空間內禁止合格的聲明者。

因此,如果存在foo的第一個聲明,則您的代碼有效(截至2012年左右; GCC有一個開放的錯誤報告 )。 但是,如果沒有,您引用的措辭仍然適用,並使合格的聲明格式不正確。 我認為沒有理由允許這種情況; 它直觀地暗示已經聲明了名稱,因為限定名稱查找必須確定它所引用的內容。

暫無
暫無

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

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