Partilhar via


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

Diretiva #error (C/C++)

assert (CRT)

Conjunto de caracteres ASCII

Declarações

Outros recursos

Modelos