consteval

Why?

  • constexpr has a “maybe” attached to it

  • Evaluation in constexpr context must be forced (see for example here)

    constexpr int i = f();     // <-- force compiletime evaluation of f
    
  • Something stronger is needed: a function that always evaluates at compiletime (⟶ no forcing needed)

  • consteval

  • Only available at compiletime

  • Same as constexpr otherwise

Usage: At Compiletime Only

  • Can only be used in constexpr context

  • ⟶ parameters must be known at compiletime

#include <iostream>

consteval int add(int l, int r)
{
    return l+r;
}

int main()
{
    const int a=40, b=2;
    int answer = add(a, b);                            // <-- no need to force
    std::cout << answer << '\n';
    return 0;
}
  • Not ok: mutable parameters

#include <iostream>

consteval int add(int l, int r)
{
    return l+r;
}

int main()
{
    int a=40, b=2;
    int answer = add(a, b);                            // <-- ERROR: is not usable in a constant expression
    std::cout << answer << '\n';
    return 0;
}

No Forcing Needed ⟶ Can Assign To Mutable Variables

  • Always runs in constexpr context

  • ⟶ no forcing needed

  • ⟶ assigned-to variable can be mutable

And constexpr?

  • consteval function can use constexpr functions

  • Reason: consteval runs at compiletime only, so it uses the compiletime version of the called constexpr functions

#include <iostream>

constexpr int add(int l, int r)
{
    return l+r;
}

consteval int add3(int v1, int v2, int v3)
{
    return add(v1, add(v2, v3));
}

int main()
{
    const int a=40, b=2;
    int answer = add(a, b);
    std::cout << answer << '\n';
    return 0;
}