std::vector::resize默认构造新元素的次数

How many times std::vector::resize should default-construct new elements?

本文关键字:元素 新元素 resize vector 默认 std      更新时间:2023-10-16

我们的团队刚刚遇到了这里描述的相同问题http://forums.codeguru.com/archive/index.php/t-514404.html,即调用some_vec.resize(new_size),其中N>=2的N = new_size - some_vec.size()和VC10默认构造所有N个新元素,而GCC默认构造单个元素,作为原型元素,为新元素复制构造它N次。

由于这是一个uuid向量,默认构造函数随机初始化每个新实例,我们最终使用GCC获得了N倍相同的uuid,使用VC获得了N个不同的uuid。这足以在一个平台上对我们的测试套件造成严重破坏,但在另一个平台却没有,而且找不到任何乐趣。

我的问题是:谁是对的?VC还是GCC?还是这是C++中一个未指明的受人喜爱的角落?TIA,--DD

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

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

v.resize(new_size, T());

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