Compartilhar 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, 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