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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour