Reputation: 89
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:
#include <iostream>
class Test
{
private :
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); // error here
static_assert(length == 3, "error");
public :
static void f()
{
std::cout << length << std::endl;
}
};
int main()
{
Test::f();
}
And here is the error I get:
error: 'static constexpr int Test::constStrLength(const char*)' called in a constant expression static constexpr int len = constStrLength("length ");
What's the right way to achieve it?
Upvotes: 2
Views: 262
Reputation: 153792
A 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.
Upvotes: 7