static_assert
Testa uma asserção de software no tempo de compilação. Se a expressão constante especificada for false
, o compilador exibirá a mensagem especificada, se ela for fornecida, e a compilação falhará com o erro C2338. Caso contrário, a declaração não terá efeito.
Sintaxe
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
Parâmetros
constant-expression
Uma expressão constante integral que pode ser convertida em um valor booliano. Se a expressão avaliada for zero (false), o parâmetro string-literal será exibido e a compilação falhará com um erro. Se a expressão for diferente de zero (true), a declaração static_assert
não terá efeito.
string-literal
Uma mensagem que será exibida se o parâmetro de expressão constante for zero. A mensagem é uma cadeia de caracteres no conjunto de caracteres de base do compilador, ou seja, não temcaracteres multibyte ou largos.
Comentários
O parâmetro constant-expression de uma declaração static_assert
representa uma declaração de software. Uma asserção de software especifica uma condição que você espera ser verdadeira (true) em um ponto específico de seu programa. Se a condição for true, a declaração static_assert
não terá efeito. Se a condição for false, a declaração falhará, e o compilador exibirá a mensagem no parâmetro string-literal e a compilação falhará com um erro. No Visual Studio 2017 e posteriores, o parâmetro literal de cadeia de caracteres é opcional.
A declaração static_assert
testa uma declaração de software no tempo de compilação. Por outro lado, as funções Macro e _assert e _wassert testam uma declaração de software no tempo de execução e geram um custo de tempo de execução no espaço ou no tempo. A declaração static_assert
é especialmente útil para depuração de modelos porque os argumentos de modelo podem ser incluídos no parâmetro constant-expression.
O compilador revisa a declaração static_assert
para erros de sintaxe quando a declaração é encontrada. O compilador avalia o parâmetro constant-expression imediatamente se ele não depende de um parâmetro de modelo. Caso contrário, o compilador avalia o parâmetro constant-expression quando é criada uma instância do modelo. Consequentemente, o compilador pode emitir uma mensagem de diagnóstico uma vez quando a declaração for encontrada e novamente quando o modelo for instanciado.
Você pode usar a palavra-chave static_assert
no escopo de namespace, classe ou bloco. (A palavra-chave static_assert
é tecnicamente uma declaração, mesmo que não apresente o novo nome em seu programa, porque pode ser usado no escopo de namespace.)
Descrição de static_assert
com escopo de namespace
No exemplo a seguir, a declaração static_assert
tem um escopo de namespace. Como o compilador conhece o tamanho do tipo void *
, a expressão é avaliada imediatamente.
Exemplo: static_assert
com escopo de namespace
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Descrição de static_assert
com escopo de classe
No exemplo a seguir, a declaração static_assert
tem escopo de classe. O static_assert
verifica que um parâmetro do modelo é um tipo de dados antigos simples (POD). O compilador revisa a declaração static_assert
quando ela é declarado, mas não avalia o parâmetro constant-expression até que seja criada uma instância basic_string
no modelo de classe main()
.
Exemplo: static_assert
com escopo de classe
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(std::is_pod<CharT>::value,
"Template argument CharT must be a POD type in class template basic_string");
// ...
};
}
struct NonPOD {
NonPOD(const NonPOD &) {}
virtual ~NonPOD() {}
};
int main()
{
std::basic_string<char> bs;
}
Descrição de static_assert
com escopo de bloco
No exemplo a seguir, a declaração static_assert
tem escopo de bloco. O static_assert
verifica se o tamanho da estrutura VMPage é igual ao tamanho da página da memória virtual do sistema.
Exemplo: static_assert
no escopo do bloco
#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
struct VMPage { // ...
};
int check_pagesize() {
static_assert(sizeof(VMPage) == PAGESIZE,
"Struct VMPage must be the same size as a system virtual memory page.");
// ...
}
// ...
};
Confira também
Asserção e mensagens fornecidas pelo usuário (C++)
Diretiva #error (C/C++)
assert Macro, _assert, _wassert
Modelos
Conjunto de caracteres ASCII
Declarações e definições