Recherche…


Syntaxe

  • static_assert ( bool_constexpr , message )
  • static_assert ( bool_constexpr ) / * Depuis C ++ 17 * /

Paramètres

Paramètre Détails
bool_constexpr Expression à vérifier
message Message à imprimer lorsque bool_constexpr est faux

Remarques

Contrairement aux assertions d'exécution , les assertions statiques sont vérifiées à la compilation et sont également appliquées lors de la compilation de générations optimisées.

static_assert

Les assertions signifient qu'une condition doit être vérifiée et si elle est fausse, c'est une erreur. Pour static_assert() , ceci est fait à la compilation.

template<typename T>
T mul10(const T t)
{
    static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
    return (t << 3) + (t << 1);
}

Un static_assert() a un premier paramètre obligatoire, la condition, qui est un constexpr de bool. Il pourrait avoir un deuxième paramètre, le message, qui est un littéral de chaîne. A partir de C ++ 17, le second paramètre est facultatif. avant cela, c'est obligatoire.

C ++ 17
template<typename T>
T mul10(const T t)
{
    static_assert(std::is_integral<T>::value);
    return (t << 3) + (t << 1);
}

Il est utilisé lorsque:

  • En général, une vérification à la compilation est requise sur un type de valeur constexpr
  • Une fonction de modèle doit vérifier certaines propriétés d'un type passé
  • On veut écrire des cas de test pour:
    • métafonctions de modèle
    • fonctions constexpr
    • métaprogrammation macro
  • Certaines définitions sont requises (par exemple, version C ++)
  • Portage du code hérité, assertions sur sizeof(T) (par exemple, int 32 bits)
  • Certaines fonctionnalités du compilateur sont requises pour que le programme fonctionne (emballage, optimisation de la classe de base vide, etc.)

Notez que static_assert() ne participe pas à SFINAE : ainsi, lorsque des surcharges / spécialisations supplémentaires sont possibles, il ne faut pas l’utiliser à la place des techniques de métaprogrammation des modèles (comme std::enable_if<> ). Il peut être utilisé dans le code de modèle lorsque la surcharge / spécialisation attendue est déjà trouvée, mais des vérifications supplémentaires sont requises. Dans de tels cas, il peut fournir des messages d'erreur plus concrets que de s'appuyer sur SFINAE pour cela.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow