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 e a compilação falhará com o erro C2338; caso contrário, a declaração não terá efeito.
static_assert(
constant-expression,
string-literal
);
Parâmetros
Parâmetro |
Descrição |
---|---|
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 é exibida se o parâmetro constant-expression for zero. A mensagem é uma cadeia de caracteres no conjunto de caracteres de base do compilador; isto é, não caracteres multibyte ou largos. |
Comentários
O parâmetro constant-expression de uma declaração static_assert representa uma asserçã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.
A declaração static_assert testa uma asserção de software no tempo de compilação. Ao contrário, a macro assert (CRT) testa uma asserção de software no tempo de execução e incorre em um custo de tempo de execução em espaço ou 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 examina 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 o modelo é instanciado. 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
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(sizeof(void *) == 4, "64-bit code generation is not supported.");
Descrição
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 examina a declaração static_assert quando ele é declarado, mas não avalia o parâmetro constant-expression até que o modelo de classe basic_string seja instanciado em main().
Exemplo
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(tr1::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
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
#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.");
// ...
}
// ...
};
Consulte também
Referência
Asserção e mensagens fornecidas pelo usuário (C++)