Antoine Morel
Antoine Morel

Reputation: 89

Can't use constexpr static member function in a constant expression

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

Answers (1)

Dietmar K&#252;hl
Dietmar K&#252;hl

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

Related Questions