static_assert
Testa uma afirmação de software em tempo de compilação.Se a expressão de constante especificada for false, o compilador exibe a mensagem especificada e a compilação falhará com um erro; Caso contrário, a declaração não tem 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 booleano. Se a expressão avaliada for zero (FALSO), o string-literal parâmetro é exibido e a compilação falhará com um erro.Se a expressão for diferente de zero (verdadeiro), o static_assert declaração não tem nenhum efeito. |
string-literal |
Uma mensagem será exibida se o constant-expression parâmetro é zero.A mensagem é uma seqüência de caracteres na conjunto de caracteres base do compilador; ou seja, não caracteres multibyte ou de longa distância. |
Comentários
O constant-expression parâmetro de um static_assert declaração representa um declaração de software.Uma declaração de software Especifica uma condição que você espera para ser verdade em um momento específico em seu programa.Se a condição for verdadeira, o static_assert declaração não tem nenhum efeito.Se a condição for falsa, a declaração falhará, o compilador exibirá a mensagem em string-literal parâmetro e a falha de compilação com um erro.
O static_assert declaração testa uma afirmação de software em tempo de compilação.Em contraste, o assert (CRT) macro testa uma afirmação de software em tempo de execução e acarreta um custo de tempo de execução no espaço ou tempo.O static_assert declaração é especialmente útil para depuração de modelos como argumentos de modelo podem ser incluídos na constant-expression parâmetro.
O compilador examina o static_assert declaração para erros de sintaxe quando a declaração é encontrada.O compilador avalia a constant-expression parâmetro imediatamente se ele não depende de um parâmetro de modelo.Caso contrário, o compilador avalia a constant-expression parâmetro quando o modelo é instanciado.Conseqüentemente, o compilador pode emitir uma mensagem de diagnóstico uma vez quando a declaração for encontrada, e novamente quando o modelo é instanciado.
Você pode usar o static_assert palavra-chave no namespace, classe ou escopo de bloco.(O static_assert palavra-chave é tecnicamente uma declaração, mesmo que ele não apresenta novo nome em seu programa, porque ele pode ser usado no escopo do espaço para nome.)
Descrição
No exemplo a seguir, o static_assert declaração tem escopo de namespace.Porque o compilador sabe 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, o static_assert declaração tem escopo de classe.O static_assert verifica se um parâmetro de modelo é um dados antigos simples tipo (POD).O compilador examina o static_assert declaração quando ele é declarado, mas não avalia a constant-expression parâmetro até o basic_string modelo de classe é instanciado no 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, o static_assert declaração tem escopo de bloco.O static_assert verifica se o tamanho da estrutura VMPage é igual a pagesize 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
Declaração e mensagens fornecido pelo usuário (C++)