2014-10-31 94 views
4

考慮以下兩個引號:類模板的靜態成員是隱式實例化的還是不是?

[C++11: 14.7.1/1]:[..]類模板專業化的隱式實例引起的聲明中的隱式實例,但沒有定義或默認參數,因此類成員函數,成員類,成員範圍成員枚舉,靜態數據成員和成員模板; [..]

[C++11: 14.7.1/8]:類模板不會導致那個類的任何靜態數據成員被隱式實例化的隱式實例。

(也分別發現逐字—除了一個新的參考異常規格—在[C++14: 14.7.1/1][C++14: 14.7.1/9]

缺少什麼我在這裏?隱式實例化類模板並隱式實例化類模板專業化之間有什麼區別?這兩個引號如何不衝突?

[C++11: 14.7.1/5]:類模板專業化如果類型是在需要完全定義的對象類型,或者如果類類型的完整性可能影響程序的語義的上下文中被隱式實例化。 [..]

+2

除非我誤讀,否則他們聽起來不像是衝突。第一個引用的內容如下:「...引起聲明的隱式實例化,而不是** ...靜態數據成員」。第二個報價也是這樣說的。 – CoryKramer 2014-10-31 11:05:44

+0

@Cyber​​:我認爲你在誤讀。那將是一個非常奇怪的句子結構,它並沒有任何意義:「_what_的聲明」?相反,我認爲第一個引號說明<所有這些東西>的聲明(但不是定義)都被隱含地實例化了。第二個引號表示<其中的一個>不會被隱式實例化。最簡單的解決方案是Angew說的:第二個報價缺少限定詞「定義」。但僅此而已,它缺少了,所以現在引號衝突。 – 2014-10-31 11:07:14

+1

噢好吧,我認爲「但不是」適用於聲明的其餘部分,但在重新閱讀後,情況並非如此。 – CoryKramer 2014-10-31 11:09:31

回答

5

我不認爲引號實際上是衝突的。帕。 1表示靜態成員的聲明被實例化,但定義不是。帕。 8表示該成員沒有實例化。由於一個非定義的東西聲明並不是真的,東西,我會說他們說同樣的事情。帕。 8也許可以澄清,也包括「定義」一詞。

這裏有幾個報價,我相信支持我對Par.8推理(即使其中沒​​有一個是水晶般清晰的證明,可惜):

14.7/2 ..一種成員函數,一個構件類,成員枚舉, 或靜態數據成員從類模板 的構件定義實例化的類模板的被調用時,分別實例化的成員函數,構件類,成員枚舉或靜態數據 會員。 ...

14.7。1/2除非類模板或成員模板的成員已明確實例化或明確 專業的專業化成員被隱式實例當專業化要求成員定義的上下文中引用 存在;特別是靜態數據成員的初始化(以及任何相關聯的 副作用)不會發生,除非靜態數據成員本身以需要定義靜態數據成員存在的方式使用 。

對我來說,這意味着「實例化一個靜態數據成員」的真正含義(所有的C++ 11,重點煤礦採取)「實例化一個靜態數據成員的定義。」

+0

聽起來很合理。你可以使用任何先前的研究或某些郵件列表討論或DR或其他方式備份你的聲明嗎?不是我已經能夠找到任何-.- – 2014-10-31 11:07:41

+1

@LightnessRacesinOrbit不是真的,它只是我如何解析英文文本。 (mf,mc,sme,** sdm **,mt)的「instantiate'(Dec &&!(Def || DefArg))' – Angew 2014-10-31 11:13:24

+0

哦,不,那一部分,我在談論第8段時雖然我同意你的解釋,但是在這段文字中沒有任何內容可以證明它。 – 2014-10-31 11:15:22

相關問題