Попробуйте переписать uninitialized_fill() (параграф 19.4.4, Е.3.1) так, что бы он справлялся с итераторами, которые генерируют исключения в операциях — и ++. Возможно ли это? Если да, то какова стоимость такого решения? Если нет, то почему?
Тут уж никакая защита справиться не может. От приведем примерчик из предыдущего упражнения, он как бы должен работать, но для исключений в итераторах он фиг что защитит.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include <iostream> using std::cout; using std::endl; #include <vector> using std::vector; class ex{}; template<class For, class T> void uninitialized_fill(For beg, For end, T& x) { For p; try { int count(0); for(p=beg;p!=end;++p) { cout <<"mu tyt 1"<<endl; if(count==2)throw 1; new (static_cast<void*>(&*p))T(x);//создаем копию х в *p (параграф 10.4.11) count++; } //&*p мы получаем адресс разыменованого элемента с целью получения указателя. } catch(...) { cout <<"mu tyt"<<endl; for(For q=beg;q!=p;++q) { cout <<"one"<<endl; try { (&*q)->~T();//вызываем деструктор } catch(...) { } } throw; } } int main() { vector<int> v(4,10); int val(4); uninitialized_fill<vector<int>::iterator,int>(v.begin(),v.end(),val); for(int i=0;i<v.size();i++) cout <<v[i]<<' '; cout <<endl; return 0; } |
В общем делаем выводы, для итераторов защиту не получиться сделать, тут уже как повезет.
[youtube]https://www.youtube.com/watch?v=4BqRK_sYDy4[/youtube]