为什么使用std::auto_ptr<>标准容器是错误的?
考虑:
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.
这个问题适用于尽可能多insert的push_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,所以这个建议可能不好.]
push_back vector当包含指针时,元素可能在一行中:
vector<SomeClass*> v;
v.push_back(new SomeClass(initVar1));
v.push_back(new SomeClass(initVar2));
v.push_back(new SomeClass(initVar3));
Run Code Online (Sandbox Code Playgroud)
有没有办法push_back用非指针变量(必须是其他变量的副本)做这样的单行?