簡體   English   中英

也許我對[class.access] / 7的理解不正確,但是

[英]Maybe my understanding of [class.access]/7 isn't correct, but

在[class.access] / 7中,我們有以下句子:

同樣,由於D是從A派生A ,所以使用A::B作為基本說明符的格式也很正確,因此必須推遲對基本說明符 s的檢查,直到看到整個基本說明符列表為止。

class A {
protected:
    struct B { };
};
struct D: A::B, A { };

請參閱帶有clang的實時示例 實際上,clang也抱怨此片段,不需要延遲。

class A {
protected:
    struct B { };
};
struct D: A, A::B { };

為什么此代碼無法編譯?

PS:gcc和VS21013也不編譯代碼。

這只是一個編譯器錯誤。 該標准的規范文本支持該示例。 多個編譯器具有相同的錯誤這一事實意味着,這是標准的一部分,很難正確地做到。

對於GCCclang,存在一些與此相關的公開錯誤。 請注意,一些相關的情況實際上是C ++ 03和C ++ 11之間的細微差別,但據我所知,並不是這種情況。

[class.access] /1.2僅聲明

protected ; 也就是說,它的名稱只能由聲明它的類的成員和朋友,由該類派生的類及其朋友使用(請參見11.4)。

而11.4對此沒有擴展。 您正在從類A派生的類D中使用名稱B 沒關系。

我相信這是clang的錯誤。 Ideone也不接受該代碼: http ://ideone.com/uiFl9L:

class A {
protected:
struct B { };
};
struct D: A::B, A { };

我檢查了gcc-5.1.0,gcc-4.9和clang-3.7(rc2)。 該標准明確指出其格式正確(請參閱問題),因此編譯器有問題。

該示例清除了[class.access] / 6:

第11條中的所有訪問控制都會影響從特定實體的聲明中訪問類成員名稱的能力,包括在要聲明的實體名稱之前的聲明部分...

根據[class.access] / 2,這意味着一個類甚至可以在聲明所有基類之前訪問所有基類。

暫無
暫無

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

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