Understanding static_assert in C++ 11

Last Updated : 12 Jun, 2026

static_assert is a compile-time assertion mechanism introduced in C++11. It verifies conditions during compilation and generates an error if a condition is not satisfied.

  • Displays custom error messages when an assertion fails.
  • Helps catch programming errors before the program runs.
C++
#include <iostream>
using namespace std;

int main()
{
    static_assert(sizeof(int) >= 4,
                  "int must be at least 4 bytes");

    cout << "Compilation successful";
    return 0;
}

Output
Compilation successful

Explanation: The assertion checks whether the size of int is at least 4 bytes. Since the condition is true, compilation succeeds.

Syntax

static_assert(constant_expression, "error message");

where:

  • constant_expression is a compile-time expression that evaluates to true or false.
  • "error message" is displayed if the assertion fails.

Compile-Time Assertions Before C++11

Before C++11, developers often used the #error directive to generate compilation errors. However, #error cannot evaluate expressions such as sizeof(), template parameters, or other compile-time computations.

CPP
#include <iostream>
using namespace std;
#if !defined(__geeksforgeeks)
#error "Geeksforgeeks hasn't been defined yet".
#endif
int main()
{
    return 0;
}

Output

./Solution.cpp:4:2: error: #error "Geeksforgeeks hasn't been defined yet".
    4 | #error "Geeksforgeeks hasn't been defined yet".
      |  ^~~~~

Using static_assert with Templates

One of the most common uses of static_assert is validating template arguments.

CPP
#include <iostream>
using namespace std;

template <class T, int Size>
class Vector {
    // Compile time assertion to check if
    // the size of the vector is greater than
    // 3 or not. If any vector is declared whose
    // size is less than 4, the assertion will fail
    static_assert(Size > 3, "Vector size is too small!");

    T m_values[Size];
};

int main()
{
    Vector<int, 4> four; // This will work
    Vector<short, 2> two; // This will fail

    return 0;
}

Output

error: static assertion failed: Vector size is too small!

Explanation: The assertion ensures that the template parameter Size is greater than 3. Since v2 uses a size of 2, compilation fails.

Advantages of static_assert

The static_assert keyword provides several benefits over traditional compile-time checking techniques.

  • Allows compile-time validation of program assumptions.
  • Produces clear and customizable error messages.
  • Works with templates and compile-time expressions.
  • Can evaluate expressions involving sizeof, type traits, and template parameters.
  • Helps detect common programming mistakes before execution.

Scope of static_assert

A static_assert declaration can appear in multiple scopes within a C++ program, allowing compile-time checks to be performed at different levels of the code.

1. Namespace Scope

A static_assert declared at namespace scope is evaluated during compilation and applies to the entire translation unit.

C++
#include <iostream>

static_assert(sizeof(void*) == 8,
              "64-bit architecture required");

int main()
{
    cout << "Assertion passed";
    return 0;
}

Output:

Assertion passed

2. Class Scope

A static_assert can be placed inside a class or class template to enforce compile-time constraints on class definitions or template parameters.CPP

C++
template <class T, int Size>
class Vector
{
    static_assert(Size > 3,
                  "Vector size is too small");

    T values[Size];
};

3. Block Scope

A static_assert can be declared inside a function or block to validate compile-time conditions that are relevant to that specific scope.

C++
template <typename T, int N>
void func()
{
    static_assert(N >= 0,
                  "Array size cannot be negative");

    T arr[N];
}

Invalid static_assert Expressions

The condition supplied to static_assert must be a valid compile-time constant expression.

C++
// CPP program to illustrate
// demonstrating an erroneous static_assert declaration
int main()
{
    static_assert(1 / 0, "never shows up!");
    return 0;
}

Output

prog.cpp:5:2: error: non-constant condition for static assertion
  static_assert(1 / 0, "never shows up!");
  ^

Explanation: The expression 1 / 0 is not a valid constant expression. Therefore, the compiler reports an error before evaluating the assertion message.

Comment