/Zc:noexceptTypes
(Reguły noexcept języka C++17)
Standard C++17 tworzy throw()
alias dla noexcept
, usuwa throw(
type-list
)
i throw(...)
, i umożliwia niektórym typom dołączanie noexcept
elementów . Ta zmiana może spowodować szereg problemów ze zgodnością źródła w kodzie zgodnym z językiem C++14 lub starszym. Opcja /Zc:noexceptTypes
określa zgodność ze standardem C++17. /Zc:noexceptTypes-
umożliwia zachowanie języka C++14 i starszego podczas kompilowania kodu w trybie C++17.
Składnia
/Zc:noexceptTypes
[-
]
Uwagi
Po określeniu /Zc:noexceptTypes
opcji kompilator jest zgodny ze standardem C++17 i traktuje throw()
go jako alias dla noexcept
elementu , usuwa throw(
)
type-list
i throw(...)
zezwala na uwzględnienie noexcept
niektórych typów. Opcja /Zc:noexceptTypes
jest dostępna tylko wtedy, gdy /std:c++17
jest włączona lub nowsza. /Zc:noexceptTypes
jest domyślnie włączona zgodnie ze standardami ISO C++17 i nowszymi. Opcja /permissive-
nie ma wpływu na /Zc:noexceptTypes
. Wyłącz tę opcję, określając/Zc:noexceptTypes-
, aby przywrócić zachowanie języka C++14 w przypadku /std:c++17
określenia lub nowszegonoexcept
.
Począwszy od programu Visual Studio 2017 w wersji 15.5, kompilator języka C++ diagnozuje bardziej niezgodne specyfikacje wyjątków w deklaracjach w trybie C++17 lub po określeniu /permissive-
opcji.
W tym przykładzie pokazano, jak deklaracje z specyfikatorem wyjątku zachowują się, gdy opcja jest ustawiona /Zc:noexceptTypes
lub wyłączona. Aby pokazać zachowanie podczas ustawiania, skompiluj przy użyciu polecenia cl /EHsc /W4 noexceptTypes.cpp
. Aby pokazać zachowanie po wyłączeniu, skompiluj przy użyciu polecenia 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
};
Podczas kompilowania przy użyciu ustawienia /Zc:noexceptTypes
domyślnego przykład generuje wyświetlone ostrzeżenia. Aby zaktualizować kod, użyj następującego polecenia:
void f() noexcept;
void f() noexcept { }
void g() noexcept(false);
struct A
{
virtual void f() noexcept;
};
struct B : A
{
virtual void f() noexcept { }
};
Aby uzyskać więcej informacji na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.
Zmodyfikuj właściwość Opcje dodatkowe, aby uwzględnić
/Zc:noexceptTypes
lub/Zc:noexceptTypes-
, a następnie wybierz przycisk OK.