Partager via


static_assert

Teste une assertion logicielle au moment de la compilation.si l'expression constante spécifiée est false, le compilateur affiche le message spécifié et la compilation échoue avec une erreur ; sinon, la déclaration n'a aucun effet.

static_assert( 
    constant-expression, 
    string-literal 
);

Paramètres

Paramètre

Description

constant-expression

Une expression constante intégrale convertible en valeur booléenne.

Si l'expression évaluée est zéro (false), le paramètre d' string-literal est affiché et les la compilation échoue avec une erreur.Si l'expression est différente de zéro (true), la déclaration d' static_assert n'a aucun effet.

string-literal

Un message qui s'affiche si le paramètre d' constant-expression est zéro.Le message est une chaîne de caractères dans jeu de caractères de base du compilateur ; autrement dit, pas multioctets ou caractères larges.

Notes

Le paramètre d' constant-expression d'une déclaration d' static_assert représente une assertion logicielle.Une assertion logicielle spécifie une condition que celles que soit remplie à un point de votre programme.Si la condition est remplie, la déclaration d' static_assert n'a aucun effet.Si la condition a la valeur false, l'assertion échoue, le compilateur affiche le message dans le paramètre d' string-literal , et les la compilation échoue avec une erreur.

La déclaration d' static_assert teste une assertion logicielle au moment de la compilation.En revanche, la macro d' assert (CRT) teste une assertion logicielle au moment de l'exécution et entraîne des coûts au moment de l'exécution dans l'espace ou le temps.La déclaration d' static_assert est particulièrement utile pour le débogage des modèles parce que les arguments template peuvent être inclus dans le paramètre d' constant-expression .

Le compilateur examine la déclaration d' static_assert pour les erreurs de syntaxe lorsque la déclaration est produite.le compilateur évalue le paramètre d' constant-expression immédiatement s'il ne dépend pas d'un paramètre de modèle.Sinon, le compilateur évalue le paramètre d' constant-expression lorsque le modèle est instancié.Par conséquent, le compilateur peut publier un message de diagnostic lorsque la déclaration est produite, puis à nouveau lorsque le modèle est instancié.

Vous pouvez utiliser le mot clé d' static_assert à l'espace de noms, de la classe, ou de la portée de bloc.(Le mot clé d' static_assert est techniquement une déclaration, bien qu'il ne doit présenter pas le nouveau nom dans votre programme, parce qu'il peut être utilisé dans la portée de l'espace de noms.)

Description

Dans l'exemple suivant, la déclaration d' static_assert a la portée de l'espace de noms.Étant donné que le compilateur connaît la taille du type void *, l'expression est évaluée immédiatement.

Exemple

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

Description

Dans l'exemple suivant, la déclaration d' static_assert a une portée de classe.static_assert vérifie qu'un paramètre de modèle est un type de données précédentes (POD) ordinaire .Le compilateur examine la déclaration d' static_assert lorsqu'il est déclaré, mais n'a pas le paramètre d' constant-expression jusqu'à ce que le modèle de classe d' basic_string a été instancié dans main().

Exemple

#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;
}

Description

Dans l'exemple suivant, la déclaration d' static_assert a une portée de bloc.static_assert vérifie que la taille de la structure de VMPage est égale à la mémoire virtuelle pagesize du système.

Exemple

#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.");
    // ...
    }
// ...
};

Voir aussi

Référence

Assertion et messages entrés par l'utilisateur (C++)

directive de #error (C/C++)

assert (CRT)

Jeu de caractères ASCII

Déclarations

Autres ressources

Modèles