function-try-block в конструкторе не мешает исключению исключения. Вот выдержка из стандартного черновика C ++ N4140, [except.handle]:
14
Если оператор-оператор появляется в обработчике функции -try-block конструктора, программа плохо сформирована.blockquote>
15
Исключенное в настоящее время исключение отменяется, если управление достигает конца обработчика функции -try-block конструктор или деструктор. В противном случае, ...Причиной этого является то, что если базовый класс или любой конструктор-член генерирует исключение, то построение всего объекта завершается ошибкой, и его невозможно исправить, поэтому нужно исключить исключение.
На этом есть GOTW , а нижняя строка -
Обработчики функции-try-block конструктора имеют только одна цель - перевести исключение. (И, возможно, сделать каротаж или некоторые другие побочные эффекты.) Они не полезны для каких-либо других целей.
blockquote>Итак, да, ваш последний пример кода отлично.