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é, le cas échéant, et la compilation échoue avec l’erreur C2338 ; sinon, la déclaration n’a aucun effet.

Syntaxe

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

Paramètres

constante-expression
Expression constante intégrale pouvant être convertie en expression booléenne. Si l’expression évaluée est zéro (false), le paramètre littéral de chaîne est affiché et la compilation échoue avec une erreur. Si l’expression est différente de zéro (true), la static_assert déclaration n’a aucun effet.

string-literal
Message affiché si le paramètre d’expression constante est égal à zéro. Le message est une chaîne de caractères dans le jeu de caractères de base du compilateur ; autrement dit, pas multioctets ni caractères larges.

Notes

Le paramètre d’expression constante d’une static_assert déclaration représente une assertion logicielle. Une assertion logicielle spécifie une condition supposée être vraie en un point particulier de votre programme. Si la condition est vraie, la static_assert déclaration n’a aucun effet. Si la condition est false, l’assertion échoue, le compilateur affiche le message dans le paramètre littéral de chaîne et la compilation échoue avec une erreur. Dans Visual Studio 2017 et versions ultérieures, le paramètre littéral de chaîne est facultatif.

La static_assert déclaration teste une assertion logicielle au moment de la compilation. En revanche, les fonctions d’assertion macro et _assert et _wassert testent une assertion logicielle au moment de l’exécution et entraînent un coût d’exécution dans l’espace ou le temps. La static_assert déclaration est particulièrement utile pour le débogage des modèles, car les arguments de modèle peuvent être inclus dans le paramètre d’expression constante.

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

Vous pouvez utiliser la mot clé à l’espace de noms, à la classe ou à l’étendue static_assert de bloc. (Le static_assert mot clé est techniquement une déclaration, même si elle n’introduit pas de nouveau nom dans votre programme, car elle peut être utilisée dans l’étendue de l’espace de noms.)

Description de l’étendue de l’espace de static_assert noms

Dans l’exemple suivant, la static_assert déclaration a une étendue d’espace de noms. Comme le compilateur connaît la taille du type void *, l'expression est évaluée immédiatement.

Exemple : static_assert avec l’étendue de l’espace de noms

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

Description de l’étendue de static_assert classe

Dans l’exemple suivant, la déclaration a une static_assert étendue de classe. Le static_assert paramètre vérifie qu’un paramètre de modèle est un type de données anciennes (POD) brut. Le compilateur examine la static_assert déclaration lorsqu’elle est déclarée, mais n’évalue pas le paramètre d’expression constante tant que le basic_string modèle de classe n’est pas instancié.main()

Exemple : static_assert avec l’étendue 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;
}

Description de l’étendue de static_assert bloc

Dans l’exemple suivant, la déclaration a une static_assert étendue de bloc. Vérifie static_assert que la taille de la structure VMPage est égale à la taille des pages de mémoire virtuelle du système.

Exemple : static_assert au niveau de l’étendue de bloc

#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

Assertion et messages fournis par l’utilisateur (C++)
#error, directive (C/C++)
assert Macro, _assert, _wassert
Modèles
Jeu de caractères ASCII
Déclarations et définitions