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。这足以在一个平台上对我们的测试套件造成严重破坏,但在另一个平台上却没有,而且很难找到。

我的问题是:谁是对的?风投还是海合会?或者这是未指定的 C++ 中那些心爱的角落之一?TIA,--DD

4

1 回答 1

6

我敢打赌,如果您使用 编译 GCC -std=c++0x,您将获得与使用 MSVC 相同的结果,即 N 个默认构造。这在 C++11 中发生了变化,请参见此处。现在有两个重载,一个只有默认构造新元素的新大小,另一个使用“原型”参数来复制构造每个新元素。

现在,无论您在何种模式下编译,要获得一致的结果,只需使用

v.resize(new_size, T());

背景信息:更改是必要的,因为现在有可以移动但不可复制的类型(如std::unique_ptr)。旧签名要求可复制性。现在,如果您使用需要复制的操作,标准容器类型的第一个模板参数只需要是可复制的。

于 2012-07-30T14:20:42.053 回答