Normal if statements evaluate their condition at runtime. However, when the condition is a constant expression, evaluating it at runtime is wasteful.

Consider this example:

#include <iostream>

int main()
{
    constexpr double pi{ 3.14159 };

    if (pi == 3.14159) // constant expression - always true
        std::cout << "Pi is correct\n";   // always executes
    else
        std::cout << "Pi is wrong\n";     // never executes

    return 0;
}

Since pi is constexpr and initialized with 3.14159, the condition pi == 3.14159 is always true. The else branch can never execute. Evaluating this condition at runtime wastes CPU cycles, and including unreachable code in the executable wastes space.

Constexpr if statements (C++17)

C++17 introduced constexpr if statements, which require the condition to be a constant expression that is evaluated at compile time.

If the condition is true, the entire if-else is replaced by the true branch. If false, it's replaced by the false branch (if it exists) or removed entirely.

To use a constexpr if, add the constexpr keyword after if:

#include <iostream>

int main()
{
    constexpr double pi{ 3.14159 };

    if constexpr (pi == 3.14159) // evaluated at compile time
        std::cout << "Pi is correct\n";
    else
        std::cout << "Pi is wrong\n";

    return 0;
}

During compilation, the compiler evaluates the condition and keeps only the true branch:

int main()
{
    constexpr double pi{ 3.14159 };

    std::cout << "Pi is correct\n";

    return 0;
}
Best Practice
Use constexpr if statements when the condition is a constant expression.
## Modern compilers and constexpr conditionals

Modern compilers often optimize regular if statements with constexpr conditions as if they were constexpr if statements. However, this optimization isn't guaranteed.

Some compilers may issue a warning suggesting you use if constexpr instead. Using constexpr if ensures compile-time evaluation even when optimizations are disabled, and makes your intent explicit.

Summary

Constexpr if statements: Introduced in C++17, these require the condition to be a constant expression evaluated at compile time. The compiler keeps only the true or false branch, removing the other entirely.

Performance benefits: Eliminates runtime evaluation overhead for constant expressions and removes unreachable code from the executable.

Syntax: Add constexpr keyword after if: if constexpr (condition).

Compiler optimization: Modern compilers often optimize regular if statements with constexpr conditions similarly, but using if constexpr guarantees this behavior and makes intent explicit.

Best practice: Use constexpr if statements when the condition is a constant expression. This ensures compile-time evaluation and clearly communicates that the condition is known at compile time.

Constexpr if statements are part of C++'s compile-time programming capabilities, allowing you to write code that makes decisions during compilation rather than execution, resulting in more efficient binaries.