静态constexpr函数与全局不同?

时间:2014-08-07 13:54:32

标签: c++ static 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;
}

1 个答案:

答案 0 :(得分:4)

这是因为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)
};

没有错误。