2014-01-08 41 views
1

在延續我的問題here使用類作爲模板參數的STL類前進decleration

我知道正向減速後如

class Foo; 

我可以聲明一個變量Foo*Foo&,但不是Foo,如果我有一個模板類Bar<T>其中只有T*T&裏面它然後相同的規則將適用於Bar<Foo>(即我只需要一個向前減速我n爲了編寫Bar<Foo>)。

我的問題是,STL類是否保證這樣的事情,他們只包含引用和模板類型的指針。我測試了這一點:

class A; 
std::vector<A> b; 

與VS2010的STL實現,它編譯,但我不知道這是不是適用於所有STL容器,也不如果這只是方式的MS的STL實現是或如果它是標準的一部分。

回答

3

C++標準除了幾個類模板外,還需要完整的類型(例如std::shared_ptrstd::unique_ptr在某些特殊情況下)。這些容器需要完整的類型,因此您的代碼示例在技術上會產生未定義的行爲,即使它可能適用於某些實現。

請注意,boost.container已經std C++ - 像containers for incomplete types

看到這個related SO post

17.6.4.8 [res.on.functions],在那裏它實例化一個模板時指定是否一個不完整的類型(3.9)被用作模板參數未定義行爲

被佈置組件,除非特別允許該組件。

感謝@DietmarKühl尋找合適的報價。

+0

即使實例化僅僅是聲明? –

+0

@DietmarKühl我不確定標準對此有何評論。它可能在技術上屬於UB,儘管不太可能以任何惡毒的方式表現出來。但這是猜測。 – juanchopanza

+0

'vector'(至少在VS2010中)不*要求完整的類型,就像我在問題中證明的那樣,所以這必須至少有些不準確。 – baruch

2

在17.6.4.8 [res.on.functions]第2段中指出

特別地,該效果未定義在下列情況下:

  • [...]
  • 如果在實例化模板組件時使用了不完整類型(3.9)作爲模板參數,除非該組件特別允許。

也就是說,標準庫容器都需要做出明確的豁免,允許他們對某些類型的實例有一個不完整的類型。我很好,容器部分沒有這樣的例外。