C++
static_assert
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.
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.