Это происходит потому, что деструктор требует броска() спецификатор. Если вы не укажете его в своем классе, компилятор записывает собственный деструктор по умолчанию для вашего класса, а деструктор по умолчанию не указывает, что вы не бросаете исключения.
Это правильно, так как общественное деструктор станд :: исключением также определяет throw()
~A() throw(){};
от стандарта (N3225) 12.4.4:
Если класс не имеет USER- объявленный деструктор, деструктор неявно объявляется как> дефолт (8.4). Неявным образом объявленный деструктор объявляется публичным членом своего класса.
Поэтому, если вы сами не объявите деструктор, компилятор создает следующий деструктор. Если все ваши деструкторы членов исключения, где nothrow
квалифицированы, компилятор, вероятно, будет генерировать деструктор с указанным throw()
.
~A(){};
И технически один может бросить исключение из этого деструктора, но это было бы очень плохой стиль программирования, поэтому исключение, вытекающее из std::exception
гарантии, что вы не бросайте какие-либо исключений в деструкторе производного класса std::exception
,
Редактировать Новые компиляторы обеспечивают деструктор, который делает у noexcept
спецификатор, если деструктор станд :: струны noexcept
указано. И другие компиляторы также сгенерируют деструктор noexcept
, если все деструкторы участника не генерируют исключений (не являются допустимыми). Это предусмотрено стандартом C++ 11 в главе 15.4. [except.spec]
14 Неявно объявленная специальная функция-член (пункт 12) должна иметь спецификацию исключения. Если F- неявно объявлен конструктор по умолчанию, конструктор копирования, перемещения конструктора, деструктора, копия Назначение оператора, или переместить оператор присваивания, его неявное исключение-спецификацией также указывает на тип ID-T, если и только если T разрешено исключение - спецификация функции, непосредственно вызванной неявным определением f; f должно разрешить все исключения, если любая функция, которую он вызывает непосредственно, разрешает все исключения, а f не допускает исключений , если каждая функция, которую он вызывает напрямую, не допускает исключений. [...]
Сообщает ли компилятор сообщение об ошибке? И если да, то почему это не в вопросе? –
@DavidHeffernan, thanx, fixed – cpp
Это в его вопросе внизу (возможно, после редактирования).То же самое и с 4.8.1, потому что деструктор по умолчанию не будет иметь спецификатор throw, который запрашивается здесь. – lpapp