Поделиться через


/Zc:noexceptTypes (Правила noexcept C++17)

Стандарт C++17 делает throw() псевдоним для noexcept, удаляет throw(type-list) и throw(...)позволяет включать noexceptопределенные типы. Это изменение может привести к ряду проблем совместимости источников в коде, соответствующем C++14 или более ранней версии. Параметр /Zc:noexceptTypes указывает соответствие стандарту C++17. /Zc:noexceptTypes- разрешает поведение C++14 и более ранних версий при компиляции кода в режиме C++17.

Синтаксис

/Zc:noexceptTypes[-]

Замечания

/Zc:noexceptTypes При указании параметра компилятор соответствует стандарту C++17 и обрабатывается throw() как псевдоним для noexcept, удаляет throw()type-listи throw(...)позволяет включать noexceptопределенные типы. Этот /Zc:noexceptTypes параметр доступен только в том случае, если /std:c++17 включена или более поздняя версия. /Zc:noexceptTypes по умолчанию включен для соответствия стандартам ISO C++17 и более поздних версий. Параметр /permissive- не влияет /Zc:noexceptTypes. Отключите этот параметр, указав /Zc:noexceptTypes- , чтобы вернуться к поведению noexcept C++14 при /std:c++17 указании или более поздней версии.

Начиная с Visual Studio 2017 версии 15.5 компилятор C++ диагностировать более несоответствие спецификаций исключений в объявлениях в режиме C++17 или при указании /permissive- параметра.

В этом примере показано, как объявления с описателями исключений ведут себя при /Zc:noexceptTypes установке или отключении параметра. Чтобы показать поведение при установке, выполните компиляцию с помощью cl /EHsc /W4 noexceptTypes.cpp. Чтобы показать поведение при отключении, выполните компиляцию с помощью cl /EHsc /W4 /Zc:noexceptTypes- noexceptTypes.cpp.

// noexceptTypes.cpp
// Compile by using: cl /EHsc /W4 noexceptTypes.cpp
// Compile by using: cl /EHsc /W4 /Zc:noexceptTypes- noexceptTypes.cpp

void f() throw();    // equivalent to void f() noexcept;
void f() { }         // warning C5043
void g() throw(...); // warning C5040

struct A
{
    virtual void f() throw();
};

struct B : A
{
    virtual void f() { } // error C2694
};

При компиляции с помощью параметра /Zc:noexceptTypesпо умолчанию пример создает перечисленные предупреждения. Чтобы обновить код, используйте следующую команду:

void f() noexcept;
void f() noexcept { }
void g() noexcept(false);

struct A
{
    virtual void f() noexcept;
};

struct B : A
{
    virtual void f() noexcept { }
};

Дополнительные сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

  3. Измените свойство "Дополнительные параметры", чтобы включить /Zc:noexceptTypes или /Zc:noexceptTypes- нажмите кнопку "ОК".

См. также

/Zc (Соответствие)
noexcept
Спецификации исключений (throw)