Consider the following code:
struct A { constexpr operator int() { return 42; } }; template void foo() {} void bar(A a) { foo(
As @Jarod42 suggests a should be constexpr. This is because templates are deduced at compile time, and so non-type arguments also have to be available at compile time. constexpr is a promise that they will be available at compile time.
a
constexpr