Предположим, у меня есть:
class Foo
{
public:
virtual ~Foo()=default;
};
Какова спецификация исключения для деструктора по умолчанию? Эквивалентен ли деструктор по умолчанию:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
Раздел 15.4 стандарта C++11 говорит, что он зависит от спецификаций исключений функций, непосредственно вызываемых неявным определением деструктора. В этом случае нет членов и базовых классов, поэтому, насколько я знаю, нет функций, напрямую вызываемых неявным деструктором. Является ли это двусмысленностью (или упущением) в стандарте?
Это, конечно, важно, потому что, если он неявно имеет throw(), то все подклассы должны объявлять свои деструкторы с помощью throw(). Не говорите мне, что создавать исключения в деструкторах — плохая идея, я это знаю. Я имею дело с большим количеством устаревшего кода, в котором спецификации исключений вообще не использовались.
В качестве информации, когда я пытался:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
Я получил ошибку (несоответствие спецификаций исключений) в GCC 4.4 (хотя я признаю, что у меня, возможно, не было правильных переключателей командной строки), но не в XCode 4.3 с использованием компиляторы «11».