考虑:
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
之外的容量,所以这个建议可能不是好。]
答案 0 :(得分:1)
嗯,这取决于你正在使用的分配器。
除了分配器之外,唯一可以依赖的是push_back()
和push_front()
如果抛出异常则保证是noop(23.1-10)。该标准绝对不禁止push_back()
抛出异常。