2012-07-30 110 views
5

我們的團隊恰好碰到了這裏所描述http://forums.codeguru.com/archive/index.php/t-514404.html同樣的問題,即主叫some_vec.resize(new_size),其中N = new_size - some_vec.size()與N> = 2,和VC10默認構造的所有N個新的元素,而GCC默認構造一個單一的元素,如原型元素,爲新元素複製構建N次。因爲這是uuid的向量,其中默認構造函數隨機初始化每個新實例,所以我們以N次與GCC相同的uuid和N個與VC不同的uuid結束。這足以在我們的測試套件中在一個平臺上造成破壞,而不是另一個平臺,並且找不到任何樂趣。std :: vector :: resize應該默認構建新元素多少次?

我的問題是這樣的:誰是對的? VC還是GCC?或者,這是C++的那些未被指定的心愛的角落之一? TIA,--DD

+1

該標準已更改。這是一個類似的問題[std :: vector,默認構造,C++ 11和重大更改](http://stackoverflow.com/questions/5759232/stdvector-default-construction-c11-and-breaking-changes) – 2012-07-30 14:23:45

+0

應該指出,你的班級有點「怪異」:基本上,你有'T x;你;'你有'x!= y'。這需要大量的額外的照顧和明確的文件... – 2012-07-30 14:25:18

+0

隨機施工是一件壞事,你可以在你的例子中看到它。大多數代碼假定所有默認的構造對象都是相等的。要解決這些問題,你應該有一個隨機功能。或者創建隨機對象的工廠。 – Dani 2012-07-30 14:26:31

回答

6

我敢打賭,如果你用-std=c++0x編譯GCC,你將得到與MSVC相同的結果,也就是N個默認結構。這已在C++ 11中更改,請參閱here。現在有兩個重載,其中一個只是默認構造新元素的新大小,另一個重載構造每個新元素的「原型」參數。現在

,得到一致的結果,無論您編譯在什麼模式,只要使用

v.resize(new_size, T()); 

背景信息:這種變化是必要的,因爲現在有類型,可以是可移動的,但不可拷貝(如std::unique_ptr)。舊簽名要求可複製性。現在,如果您使用需要副本的操作,則標準容器類型的第一個模板參數只需要可複製。

相關問題