2014-10-08 2 views
8

Для следующего кодафункция-Try-блок и noexcept

struct X 
{ 
    int x; 
    X() noexcept try : x(0) 
    { 
    } 
    catch(...) 
    { 
    } 
}; 

Visual Studio 14 CTP выдает предупреждение

предупреждение C4297: 'X :: X': функция предполагается, не бросать исключение, но делает

примечание: __declspec (nothrow), бросок(), noexcept (истина) или noexcept был указан на функции

Это неправильное использование noexcept? Или это ошибка в компиляторе Microsoft?

ответ

11

Или это ошибка в компиляторе Microsoft?

Не совсем.

Так называемый блок функции-try-block, подобный этому, не может помешать исключению извне. Учтите, что объект никогда не строится полностью, так как конструктор не может завершить выполнение. catch -блока должен бросить что-то другое или текущее исключение будет вызван повторно ([except.handle]/15):

в настоящее время обрабатывается исключение, если вызвано повторно управление достигает конец обработчика в function-try-block конструктора или деструктор.

Поэтому компилятор выводит, что конструктор действительно может выбросить.

struct X 
{ 
    int x; 
    X() noexcept : x(0) 
    { 
     try 
     { 
      // Code that may actually throw 
     } 
     catch(...) 
     { 
     } 
    } 
}; 

Следует скомпилировать без предупреждения.

Смежные вопросы