std :: vector :: resize应该多少次默认构造新元素?

dde*_*nne 5 c++ stl stdvector

我们的团队遇到了这里描述的相同问题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的向量,其中default-constructor随机初始化每个新实例,我们最终得到N次与GCC相同的uuid和N个与VC不同的uuid.这足以在我们的测试套件中在一个平台上造成严重破坏而不是另一个平台,并且找到它并不好玩.

我的问题是:谁是对的?VC还是GCC?或者这是C++那些心爱的角落之一,这是未指明的?TIA,--DD

Xeo*_*Xeo 6

我敢打赌,如果你编译GCC -std=c++0x,你将得到与MSVC相同的结果,即N个默认结构.这在C++ 11中有所改变,请参见此处.现在有两个重载,一个只有新的大小默认构建新的元素,而另一个需要一个"原型"参数复制,构建从每一个新的元素.

现在,无论您编译什么模式,都可以获得一致的结果,只需使用即可

v.resize(new_size, T());
Run Code Online (Sandbox Code Playgroud)

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