Сильная гарантия безопасности исключений говорит о том, что операция не изменит какое-либо состояние программы, если возникает исключение. Элегантным способом реализации исключения для копирования является copy-and-swap idiom.C++ исключение безопасность паранойя: сколько слишком много?
Моих вопросов:
было бы излишество использовать копирование и замены для каждой мутагенной работы класса, который мутирует непримитивные тип?
Является ли производительность действительно справедливой торговлей для сильного исключения-безопасности?
. Например:
class A
{
public:
void increment()
{
// Copy
A tmp(*this);
// Perform throwing operations on the copy
++(tmp.x);
tmp.x.crazyStuff();
// Now that the operation is done sans exceptions,
// change program state
swap(tmp);
}
int setSomeProperty(int q)
{
A tmp(*this);
tmp.y.setProperty("q", q);
int rc = tmp.x.otherCrazyStuff();
swap(tmp);
return rc;
}
//
// And many others similarly
//
void swap(const A &a)
{
// Non-throwing swap
}
private:
SomeClass x;
OtherClass y;
};
Ответ зависит в значительной степени от вашего домена, и на него нельзя ответить за его пределами. Если от этого зависит жизнь, ответ очевиден: он достоин штрафа за исполнение. Если код обработки исключений уничтожит ваш объект в случае исключения, это не имеет значения. Теперь вам нужно найти, где в середине лежит ваш код. –
Если вы правильно определяете свой код в компонентах с одной ответственностью, вы часто получаете много исключений безопасности «бесплатно». В вашем примере, почему функция «increment» делает «сумасшедшие вещи»? Либо инкрементный алгоритм является сложным, но и знает, как выполнить вычисление транзакционно, или вам нужно отделить приращение и crazystuffing. –
Ну, вы можете использовать ту же идею и просто применить ее к членам. Не нужно быть всем этим. Что сказать, если ваш класс содержит вектор строк, и вам нужно только его изменить? Не копируйте и не меняйте весь класс, вектор и все. Просто сделайте это на одной строке. – BoBTFish