/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 noexceptelementó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 noexceptelementu , usuwa throw()type-listi throw(...)zezwala na uwzględnienie noexceptniektó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:noexceptTypesdomyś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

  1. 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).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. Zmodyfikuj właściwość Opcje dodatkowe, aby uwzględnić /Zc:noexceptTypes lub/Zc:noexceptTypes-, a następnie wybierz przycisk OK.

Zobacz też

/Zc (Zgodność)
noexcept
Specyfikacje wyjątków (throw)