2016-04-20 45 views
16

不知道在哪裏問(如果這是一個不適當的問題,可以隨意關閉它),但是我沒有在C++ 17的提案中找到任何具體的內容,thisthis在處理嵌套名稱空間時都沒有提到C++。C++ 17會允許嵌套類的前向聲明嗎?

所以目前這是唯一的選擇:

class A 
{ 
public: 
    class B; //forward-declared INSIDE class/namespace 
}; 

class A::B //defined outside 
{ 
}; 

這將有可能在C + + 17?

class A::B; //forward declared NESTED outside of parent class/namespace 

class C 
{ 
    A::B *b; 
}; 

,然後或者這(1)(作爲似乎是嵌套namepsace定義的提議)

class A::B //definition of A::B without defining A 
{ 

}; 

或該(2)

class A 
{ 
public: 
    class A::B 
    { 

    }; 
}; 

或該[3]

class A 
{ 
public: 
    class B; 
}; 

class A::B 
{ 
}; 

我懷疑定義o如果沒有定義A,那麼第一個可能無法工作(雖然該提案似乎允許)。

+4

* class * es與* namespace * s大不相同。但請參閱[P0289](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0289r0.pdf)。 – cpplearner

回答

6

有一個關於題目爲Forward declarations of nested classesP0289R0的問題。然而,正如你可以從最後的Trip Report: C++ Standards Meeting in Jacksonville, February 2016看到的那樣,這個建議是爲鼓勵進一步工作的建議的延續。我引述該委員會的裁決(重點煤礦):

這將使之類的東西X::A*出現在頭部,而不需要 爲X的定義也出現在頭 (正向聲明XX::A就足夠了)。 EWG發現 用例引人注目,因爲目前很多類定義到 僅出現在頭中,因爲頭中定義的接口使用 指針或對類型的嵌套類的引用。 幾個細節 仍然需要制定出。 (例如,如果X一個 定義不以任何其他翻譯單元(TU)出現時會發生什麼? 如果X一個定義出現在另一恩會發生什麼,但不 定義嵌套class A?如果真的發生了什麼確定一個嵌套類 A,但是它是私有的?對某些或所有這些的答案可能必須是 「不合格,不需要診斷」,因爲診斷 這類錯誤需要重要的鏈接器支持。)

+0

我可能會誤解,但提出的問題似乎得到了回答。即使它最初被採用爲更具限制性的版本,它也會有很大的好處,並且如果結果正常,可以在後來的標準中放寬。我認爲更大的擔憂可能是文章中提到的丟失的屬性 - 也就是說,X :: A當前自動也意味着定義,並且(因此)不會引起任何名稱查找。但我覺得這是一個可以接受的價格。希望它能夠全部解決,並且這個提議將它變成最終的C++ 17! – Resurrection

+0

@Resurrection幸運或不幸的是,提出的問題是否已經得到解答,取決於C++委員會的決定:)。就我個人而言,我希望這個提議能夠將它提交給C++ 17,因爲我覺得它很有用,而且一般來說,我認爲嵌套類的前向聲明是必須關閉的語言漏洞。 – 101010