Подтвердить что ты не робот

Использует ли исключение использовать семантику при броске в С++ 11?

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4

В этой статье Herb Sutter объясняет, что для исключения исключения требуется копия исключения, созданная как временная, и поэтому использует std::auto_ptr для обхода служебных данных. В свете семантики перемещения, доступной на С++ 11, это все еще необходимо?

4b9b3361

Ответ 1

Я только что проверил, и стандарт позволяет

  • опускать копию или перемещение объекта, указанного операндом выражения throw в объект исключения
  • опускать копию или перемещение объекта исключения в переменную класса catch того же типа, что и объект исключения, если вы иначе не измените значение программы (т.е. если бы вы повторно и последующие уловы внезапно увидели бы измененный объект исключений, измененный предыдущим блоком catch).

Поскольку эти пропуски разрешены, спецификация требует сначала рассмотреть источник копии или двигаться как rvalue. Таким образом, это означает, что соответствующие объекты будут перемещены, если это возможно. Конечно, копирование и перемещение elision по-прежнему разрешены в качестве первого выбора.


Update

Мне было сообщено, что рассмотрение инициализатора объекта исключения параметра catch в качестве инициализатора rvalue, вероятно, будет удалено из стандарта (поскольку, как правило, во всех случаях невозможно обнаружить, когда поведение программы без изменений при отсутствии копии/перемещения), поэтому я рекомендую не полагаться на это (вторая марка выше).

То, о чем вы все еще можете положиться, - это перемещение локальной переменной в объект исключения, как в throw x; (первый маркер выше).

Ответ 2

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

Это дефект С++ 11. См. CWG1493.