这个问题是关于 new[] int 和 new [] int() 在语义和性能上的差异,以及在向 allocator_traits::construct() 添加 ctor 参数的完美转发时可能无意中创建的从第一个措辞到第二个措辞的变化。这个问题不涉及一个非常明显的问题,即默认 ctor 在由向量的 resize() 构造的所有新元素上运行。
对我来说,在调整大小时清除内置类型向量的元素似乎是一种浪费。但是 VS2012 的实现使得 resize(n) 以及因此带有 count 参数的构造函数实际上将分配的值数组设置为 0。
我还在标准中找到了对此的支持(http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf),但我认为它可能是一个错误在那里,因为它依赖于最近涉及完美转发的条款:
第 507 页:
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
5 效果:调用
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...).
并且由于 new int() 必须根据同一文档第 191 页上的第 11 条将值设置为 0,因此向量中的浪费实现是正确的。
问题是标准提交是否真的希望构造调用的空参数包导致行为从默认构造更改为基本类型的值构造。