Какова спецификация исключений для виртуального деструктора по умолчанию в C++11?

Предположим, у меня есть:

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».

9
задан user1414050 24 May 2012 в 04:25
поделиться