Namespaces
Variants

contract_assert statement (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Une contract_assert est une assertion contractuelle qui peut apparaître dans le corps d'une fonction ou d'une lambda pour vérifier une condition interne. Elle garantit que la condition est respectée pendant l'exécution, déclenchant une violation (par exemple, une terminaison) dans les versions de débogage si la condition s'évalue à false ou si l'évaluation se termine via une exception, et peut être ignorée dans les versions de production pour des raisons de performance.

Table des matières

Syntaxe

contract_assert attr  (optionnel) ( prédicat ) ;
attr - n'importe quel nombre d' attributs
predicate - expression booléenne qui devrait s'évaluer à true

Mots-clés

contract_assert

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_contracts 202502L (C++26) Contrats

Exemple

La contract_assert garantit que la norme du vecteur est positive et soit normale ou subnormale .

template <std::floating_point T>
constexpr auto normalize(std::array<T, 3> vector) noexcept
    pre(/* est_normalisable(vector) */)
    post(/* vector: est_normalisé(vector) */)
{
    auto& [x, y, z]{vector};
    const auto norm{std::hypot(x, y, z)};
    // vérification de débogage pour la sécurité de normalisation
    contract_assert(std::isfinite(norm) && norm > T(0));
    x /= norm, y /= norm, z /= norm;
    return vector;
}

État de la prise en charge

Fonctionnalité C++26

Document(s)

GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray


Contracts ( FTM ) * P2900R14

Références

  • Norme C++26 (ISO/CEI 14882:2026) :
  • 8.(7+ c  ) Instruction d'assertion [stmt.contract.assert]

Voir aussi

interrompt le programme si la condition spécifiée par l'utilisateur n'est pas true . Peut être désactivé pour les versions de production.
(macro fonction)
Assertions de contrat (C++26) spécifie les propriétés qui doivent être vérifiées à certains points pendant l'exécution
static_assert déclaration (C++11) effectue une vérification d'assertion à la compilation
spécificateurs de contrat de fonction (C++26) spécifie les préconditions ( pre ) et postconditions ( post )
[[ assume ( expression )]]
(C++23)
spécifie que l' expression sera toujours évaluée à true à un point donné
(spécificateur d'attribut)