静态constexpr函数不同于全局函数



我不明白为什么静态constexpr的行为不同于全局constexpr。我做错了什么?编译错误不是特别有用:

prog.cpp:20:17: error: ‘static constexpr int Bar::foo(const char*)’ called in a constant expression
B = Bar::foo(s)
             ^
prog.cpp:20:17: error: enumerator value for ‘B’ is not an integer constant

代码如下:

#include <iostream>
constexpr int foo(const char* v)
{
    return v[0];
}
struct Bar
{
    static constexpr int foo(const char* v)
    {
        return v[0];
    }
    static constexpr const char* s = "abc";
    enum
    {
        A = ::foo(s),
        B = Bar::foo(s)
    };
};
int main()
{
    int a[Bar::A];
    a[0] = Bar::A;
}

这是因为enum是类声明的一部分,而类内部函数的定义在逻辑上被延迟到类声明之后。这意味着就enum而言,它看不到B::foo的定义,因此它不能将其作为常量表达式调用。您可以通过在类后面放置enum来看到这一点:

#include <iostream>
constexpr int foo(const char* v)
{
    return v[0];
}
struct Bar
{
    static constexpr int foo(const char* v)
    {
        return v[0];
    }
    static constexpr const char* s = "abc";
};
enum Enum
{
    A = ::foo(Bar::s),
    B = Bar::foo(Bar::s)
};

最新更新