/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:noexceptTypes
padrã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
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.
Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.
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)