2012-07-30 64 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)。旧签名要求可复制性。现在,如果您使用需要副本的操作,则标准容器类型的第一个模板参数只需要可复制。

相关问题