Аффекты и исключения - PullRequest
       1

Аффекты и исключения

5 голосов
/ 28 октября 2010

Допустим, у меня есть следующая функция:

SomeType createSomeType();

, которая может throw в зависимости от некоторых причин.

Тогда:

SomeType val = SomeType(); // initial value

try
{
  val = createSomeType(); // here
}
catch (std::exception&)
{
}

Если createSomeType() throws, могу ли я всегда предполагать, что val значение равно без изменений ?

Ответы [ 3 ]

7 голосов
/ 28 октября 2010

Да, если createSomeType () генерирует исключение, назначение не произойдет.Поток управления будет идти от оператора throw, через деструкторы любых объектов, которые createSomeType () имеет в стеке, и, наконец, к оператору catch.

1 голос
/ 28 октября 2010

Если оператор присваивания для SomeType является безопасным для исключения, то вы можете быть уверены, что либо val будет присвоено непротиворечивое новое значение, либо его начальное значение останется неизменным.

Однако исключение может быть вызвано либо createSomeType(), либо назначением после успешного выполнения createSomeType(). Если оператор присваивания для SomeType перегружен и может генерировать исключения, может случиться так, что val окажется в «наполовину назначенном» несогласованном состоянии. Последнее является результатом непринятия безопасности исключений в SomeType дизайне, который плох, но все же может произойти.

0 голосов
/ 28 октября 2010

из стандартных документов 15.2.1,

Когда управление переходит от выражения броска к обработчику, деструкторы вызываются для всех созданных автоматических объектов. с момента ввода блока try. Автоматические объекты уничтожаются в порядке, обратном завершению их строительство.

Следовательно, значение val не изменится ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...