Пример исключения из гарантии безопасности правильный?

Я обсуждаю гарантии безопасности исключений и придумал пример, который, как мне кажется, дает строгую гарантию:

template<typename E, typename LT>
void strongSort(vector<E*> &data, LT lt) // works on pointers
{
  vector<E*> temp { data };  // bad_alloc? but 'data' not changed. 
  sort(temp.begin(), temp.end(), lt); // 'lt' might throw!
  swap(temp, data); // considered safe.
}

Просто (C++0x)- пример, как это используется:

int main() {
  vector<int*> data { new int(3), new int(7), new int(2), new int(5) };
  strongSort( data, [](int *a, int *b){ return *a<*b;} );
  for(auto e : data) cout << *e << " ";
}

Если предположить, LT не меняет elments, но может бросить. Правильно ли предположить, что код обеспечивает

  • Сильная исключительная гарантия безопасности
  • Является ли исключение нейтральным, по отношению к LT

2 ответа

Решение

Да. Сильная гарантия исключения означает, что операция завершается успешно или оставляет данные без изменений.

Нейтральное исключение означает, что вы разрешаете распространению исключений.

Это исключение безопасно. Чтобы быть более безопасным, почему бы не использовать vector<shared_ptr<int>>

template<typename Type, typename Func>
void StrongSort( vector<shared_ptr<Type>>& elems, Func fun)
{
    vector<shared_ptr<Type>> temp ( elems.begin(), elems.end());
    sort(temp.begin(), temp.end(), fun);
    swap(elems, temp);
}

vector<shared_ptr<int>> ints;
ints.push_back(shared_ptr<int>(new int(3)));
ints.push_back(shared_ptr<int>(new int(1)));
ints.push_back(shared_ptr<int>(new int(2)));
StrongSort(ints, [](shared_ptr<int> x, shared_ptr<int> y) -> bool { return *x < *y; });
Другие вопросы по тегам