First, thanks for welcoming me on this forum.
I'm trying to play around with constexpr and static_assert. I actually need to check the length of a constexpr string, which is calculated by a dedicated function. Here is what I'm trying to run :
using namespace std;
static constexpr char str = "abc";
static int constexpr constStrLength(const char* str)
return *str ? 1+constStrLength(str+1) : 0;
static constexpr int length = constStrLength(str);
static_assert(length ==3, "error");
static void f()
cout << len << endl;
error: 'static constexpr int Test::constStrLength(const char*)' called
in a constant expression static constexpr int len =
constexpr function used as a
constexpr function needs to be defined at the point of use. However, when you use
constStrLength() to define
length it is only declared: member function defined within the class definition are actually only declared within the class definition! Their definition becomes available right after the class definition, i.e., informally speaking right after the closing parenthesis.
The fix is to define
constStrLength() prior to its use, e.g., as a non-member function or by defining it in a base class.