Compartilhar via


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++)

# Erro diretiva (C/C++)

assert (CRT)

Conjunto de caracteres ASCII

Declarações

Outros recursos

Modelos