Вы должны поймать по константе lvalue (2):
try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}
Обоснование:
В C ++ 11 возможно (с помощью shared_future
), что два потокаможет раскручивать одно и то же исключение одновременно.Это может произойти в вашем коде, даже если вы не знаете об использовании shared_future
, если только вы не управляете всем приложением.
Если два потока перехватывают одно и то же исключение одновременно и один или оба потокаизменяет исключение, тогда у вас есть условие гонки.
Так что, пока вам не нужно изменять объект исключения в предложении catch, позвольте компилятору применять эту политику для вас - catch by const&
.Если вам действительно нужно изменить исключение, сделайте его копию, измените копию и выбросьте ее.Вы можете сделать это, перехватывая по значению, если вы уверены, что это не разделит ваш объект исключения (что обычно не происходит, если вы перехватываете std::exception
).