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

Ste*_*sop 11 c++ standards-compliance

考虑:

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

我之所以选择int它是因为它没有可以抛出的构造函数 - 显然如果T的一些复制构造函数抛出,那么该异常就会逃脱vector<T>::push_back.

这个问题适用于尽可能多insertpush_back,但它的灵感来自于它是安全的push_back"动态分配的对象",以矢量?,这恰好询问push_back.

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

标准中有其他任何东西可以保证吗?

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

作为后续行动,任何人都可以想到任何实施会抛出的原因吗?我能想到的最好的方法是,如果一个调用reserve结束时将容量增加到一个超过的值max_size(),那么insert可能length_error会在超过最大值时抛出.增加容量是没用的max_size(),但是我没有立即看到任何禁止的东西,或者[编辑:你的分配器可能会阻止你增加容量max_size,所以这个建议可能不好.]

Let*_*_Be 1

嗯,这取决于您使用的分配器。

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