我无法理解为什么静态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;
}
答案 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)
};
没有错误。