是否允许std :: vector :: push_back因重新分配或构造失败以外的任何原因而抛出?

时间:2010-11-15 16:21:46

标签: c++ standards-compliance

考虑:

std::vector<int> v;
v.reserve(1);
v.push_back(1); // is this statement guaranteed not to throw?

我选择了int,因为它没有可以抛出的构造函数 - 显然如果T的某个复制构造函数抛出,那么该异常会转义vector<T>::push_back

这个问题同insert一样适用于push_back,但它受到Is it safe to push_back 'dynamically allocated object' to vector?的启发,恰好询问push_back

在C ++ 03和C ++ 0x标准/ FCD中,vector::insert的描述表示如果没有重新分配,插入点之前的迭代器/引用仍然有效。他们说如果没有重新分配,则不会抛出任何异常(除非来自T的构造函数等)。

标准中是否还有其他内容可以保证这一点?

我不希望push_back做任何可能在这种情况下抛出的事情。 GNU实现没有。问题是标准是否禁止它。

作为后续行动,任何人都可以想到任何实施会抛出的原因吗?我能想到的最好的一点是,如果对reserve的调用最终将容量增加到超过max_size()的值,则可能允许insert抛出length_error当超过最大尺寸时。将容量增加到max_size()以上是没用的,但是我没有立即看到任何禁止的东西,[编辑:你的分配器可能会阻止你增加max_size之外的容量,所以这个建议可能不是好。]

1 个答案:

答案 0 :(得分:1)

嗯,这取决于你正在使用的分配器。

除了分配器之外,唯一可以依赖的是push_back()push_front()如果抛出异常则保证是noop(23.1-10)。该标准绝对不禁止push_back()抛出异常。