В принципе, понять, почему происходит копирование, можно. Объект создается на стеке, при выходе за границу блока должен быть удален - тем более, если этот throw случился не тут же, а в какой-нибудь функции f, вызванной из try. Тут как раз претензий нет. А вот почему при наличии копирующего конструктора копирование исчезает, действительно непонятно.
Оставалась небольшая надежда на то, что компилятор шибко умный и даже при отключенной оптимизации что-то там пытается соптимизировать, но ситуация повторилась и при разнесении на три файла класса ce, функции, возбуждающей исключение, и функции - обработчика.
Что забавно, добиться исключения копирования можно и без копирующего конструктора - достаточно добавить в класс любую виртуальную функцию, либо сделать деструктор виртуальным. Причем добавление любого другого констроктора не помогает.
Возможно, при таком минимальном усложнении класса объект-исключение начинает храниться уже не в стеке, а где-то еще.
|