2011-10-24 30 views
5

我有這段非常簡單的代碼;MSVCC/g ++/icc中std deque/vector之間的不同行爲

#include <deque> 
#include <vector> 

using namespace std; 

class A 
{ 
public: 
    A(){}; 
    ~A(){}; 
    deque<A> my_array; // vector<A> my_array; 
}; 

int main(void) 
{ 
} 

如果我編譯這段代碼既g ++以及ICC/ICPC在Linux上編譯罰款,即使-Wall它沒有給出警告。如果我將雙側齒輪換成矢量,情況也是一樣的。

我想建立使用MSVCC(CL)窗口這個代碼,但不幸的是它會拋出錯誤c2027:我改變std::dequestd::vector它編譯與Visual Studio 2010

精細

error C2027: use of undefined type 'A' 

然而,如果

我的問題是;這種行爲是否由於某種原因而被預期?如果是這樣,爲什麼編譯器之間存在差異,或者這是g ++/icc還是MSVCC的錯誤?

回答

12

這是不確定的行爲(包括具有std::dequestd::vector, 所以不管實現是否與它是好的,只要 標準而言。你實例化一個標準容器 一個不完整的類型。

當相剋編譯++,-Wall(在一般情況下,所有的選項開始 與-W)唯一擔心的語言。對於庫的問題,您應該 與-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC以及編譯。(如果這導致性能 的問題,您可以刪除最後的t wo -D in優化版本。)

+0

+1,但是,我期待只有'deque'的UB。 – iammilind

+0

「就標準而言,無論採用哪種實現方式都沒有問題」 - 符合標準的實現不應僅僅因爲它具有未定義的行爲而無法編譯它。儘管它當然可以提供診斷功能,並將實現變爲一種適用模式,其中這些診斷只是警告可能有點模糊。 –

+0

@SteveJessop標準 (§1.3.12)中的_undefined behavior_的定義明確說明了「本國際標準對其所規定的 ** no **要求」(emphisis補充)。在緊接着的 筆記中,它給出了「終止**翻譯**或執行(使用 發佈診斷消息)」,作爲 實現可能執行的操作的示例。 –

0

除了James Kanze的回答,我搜索了四周,發現了this Dr Dobbs article,它解釋了使用不完整類型容器的標準立場。

此外它暗示它與vector s協同工作的原因,而不是deque,即實現。一個典型的載體可以是這樣的

class vector<T> { 
    T* buff; 
    int size; 
    // ... snip 
}; 

這是正常與不完全類型,因爲我們只有一個指向Tdeque很可能以這樣的方式來實現(在VS2010),它利用了T的價值從而使其與不完整類型不兼容。

相關問題