Ответ 1
Я только что проверил, и стандарт позволяет
- опускать копию или перемещение объекта, указанного операндом выражения throw в объект исключения
- опускать копию или перемещение объекта исключения в переменную класса catch того же типа, что и объект исключения, если вы иначе не измените значение программы (т.е. если бы вы повторно и последующие уловы внезапно увидели бы измененный объект исключений, измененный предыдущим блоком catch).
Поскольку эти пропуски разрешены, спецификация требует сначала рассмотреть источник копии или двигаться как rvalue. Таким образом, это означает, что соответствующие объекты будут перемещены, если это возможно. Конечно, копирование и перемещение elision по-прежнему разрешены в качестве первого выбора.
Update
Мне было сообщено, что рассмотрение инициализатора объекта исключения параметра catch в качестве инициализатора rvalue, вероятно, будет удалено из стандарта (поскольку, как правило, во всех случаях невозможно обнаружить, когда поведение программы без изменений при отсутствии копии/перемещения), поэтому я рекомендую не полагаться на это (вторая марка выше).
То, о чем вы все еще можете положиться, - это перемещение локальной переменной в объект исключения, как в throw x;
(первый маркер выше).