Partilhar via


/Zc:noexceptTypes (Regras noexcept C++17)

O padrão C++17 faz throw() um alias para noexcept, remove throw(type-list) e throw(...)permite que determinados tipos incluam noexcept. Essa mudança pode causar problemas de compatibilidade de origem com o código que está em conformidade com a C++14 ou anterior. A opção/Zc:noexceptTypes especifica a conformidade com o padrão C++17. /Zc:noexceptTypes- permite o comportamento C++14 e anterior quando o código é compilado no modo C++17.

Sintaxe

/Zc:noexceptTypes[-]

Comentários

Quando a opção /Zc:noexceptTypes é especificada, o compilador está em conformidade com o padrão C++17 e trata como um alias throw() para noexcept, remove throw(type-list) e throw(...), e permite que determinados tipos incluam noexcept. A opção /Zc:noexceptTypes só está disponível quando /std:c++17 ou posterior está habilitada. /Zc:noexceptTypes é habilitado por padrão para estar em conformidade com os padrões ISO C++17 e posteriores. A opção /permissive- não afeta /Zc:noexceptTypes. Desative essa opção especificando /Zc:noexceptTypes- para reverter para o comportamento C++14 de noexcept quando /std:c++17 ou posterior é especificado.

A partir do Visual Studio 2017 versão 15.5, o compilador C++ diagnostica especificações de exceção mais incompatíveis em declarações no modo C++17 ou quando você especifica a opção /permissive-.

Este exemplo mostra como as declarações com um especificador de exceção se comportam quando a opção /Zc:noexceptTypes está definida ou desabilitada. Para mostrar o comportamento quando definido, compile usando cl /EHsc /W4 noexceptTypes.cpp. Para mostrar o comportamento quando definido, compile usando 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
};

Quando compilado usando a configuração /Zc:noexceptTypespadrão, o exemplo gera os avisos listados. Para atualizar seu código, use o seguinte em vez disso:

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

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

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

Para obter mais informações sobre problemas de conformidade no Visual C++, confira Comportamento fora do padrão.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  3. Modifique a propriedade Opções Adicionais para incluir /Zc:noexceptTypes ou /Zc:noexceptTypes-, e escolha OK.

Confira também

/Zc (Conformidade)
noexcept
Especificações de exceção (lançar)