static_assert
declaration(since C++11)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 | ||||||||||||||||
| ||||||||||||||||
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 | ||||||||||||||||
|
|
Performs compile-time assertion checking.
Contents |
static_assert( bool-constexpr, unevaluated-string) | (1) | ||||||||
static_assert( bool-constexpr) | (2) | (since C++17) | |||||||
static_assert( bool-constexpr, constant-expression) | (3) | (since C++26) | |||||||
Declares a static assertion. If the assertion fails, the program is ill-formed, and a diagnostic error message may be generated.
bool-constexpr | - |
| ||||
unevaluated-string | - | anunevaluated string literal that will appear as the error message | ||||
constant-expression | - | aconstant expressionmsg satisfying all following conditions:
|
Astatic_assert declaration may appear at namespace and blockscope (as ablock declaration) and inside a class body (as amember declaration).
Ifbool-constexpr is well-formed and evaluates totrue, or is evaluated in the context of a template definition and the template is uninstantiated, this declaration has no effect. Otherwise a compile-time error is issued, and the user-provided message, if any, is included in the diagnostic message.
The text of the user-provided message is determined as follows:
| (since C++26) |
The standard does not require a compiler to print the verbatim text oferror message, though compilers generally do so as much as possible.
Since the error message has to be a string literal, it cannot contain dynamic information or even aconstant expression that is not a string literal itself. In particular, it cannot contain thename of thetemplate type argument. | (until C++26) |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_static_assert | 200410L | (C++11) | static_assert (syntax(1)) |
201411L | (C++17) | Single-argumentstatic_assert (syntax(2)) | |
202306L | (C++26) | User-generated error messages (syntax(3)) |
#include <format>#include <type_traits> static_assert(03301==1729);// since C++17 the message string is optional template<class T>void swap(T& a, T& b)noexcept{ static_assert(std::is_copy_constructible_v<T>,"Swap requires copying"); static_assert(std::is_nothrow_copy_constructible_v<T>&&std::is_nothrow_copy_assignable_v<T>,"Swap requires nothrow copy/assign");auto c= b; b= a; a= c;} template<class T>struct data_structure{ static_assert(std::is_default_constructible_v<T>,"Data structure requires default-constructible elements");}; template<class>constexprbool dependent_false=false;// workaround before CWG2518/P2593R1 template<class T>struct bad_type{ static_assert(dependent_false<T>,"error on instantiation, workaround"); static_assert(false,"error on instantiation");// OK because of CWG2518/P2593R1}; struct no_copy{ no_copy(const no_copy&)= delete; no_copy()=default;}; struct no_default{ no_default()= delete;}; #if __cpp_static_assert >= 202306L// Not real C++ yet (std::format should be constexpr to work):static_assert(sizeof(int)==4,std::format("Expected 4, got {}", sizeof(int)));#endif int main(){int a, b; swap(a, b); no_copy nc_a, nc_b; swap(nc_a, nc_b);// 1 [[maybe_unused]] data_structure<int> ds_ok;[[maybe_unused]] data_structure<no_default> ds_error;// 2}
Possible output:
1: error: static assertion failed: Swap requires copying2: error: static assertion failed: Data structure requires default-constructible elements3: error: static assertion failed: Expected 4, got 2
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2039 | C++11 | only the expression before conversion is required to be constant | the conversion must also be valid in a constant expression |
CWG 2518 (P2593R1) | C++11 | uninstantiatedstatic_assert(false,""); was ill-formed | made well-formed |
shows the given error message and renders the program ill-formed (preprocessing directive)[edit] | |
aborts the program if the user-specified condition is nottrue. May be disabled for release builds. (function macro)[edit] | |
contract_assert statement(C++26) | verifies an internal condition during execution[edit] |
(C++11) | conditionallyremoves a function overload or template specialization from overload resolution (class template)[edit] |
Type traits(C++11) | define compile-time template-based interfaces to query the properties of types |
C documentation forStatic assertion |