/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
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
Измените свойство "Дополнительные параметры", чтобы включить
/Zc:noexceptTypes
или/Zc:noexceptTypes-
нажмите кнопку "ОК".