constexpr int f ();
void indirection ();
int main () {
constexpr int n = f (); // ill-formed, `int f ()` is not yet defined
indirection ();
}
constexpr int f () {
return 0;
}
void indirection () {
constexpr int n = f (); // ok
}
答案 0 :(得分:2)
必须在编译时,在使用它的每一点都知道constexpr
。
这与您不能声明不完整类型的变量基本相同,即使该类型稍后在同一来源中完全定义。
答案 1 :(得分:2)
C ++ 14标准提供了以下代码片段(为方便起见,我简称):
constexpr void square(int &x); // OK: declaration
struct pixel {
int x;
int y;
constexpr pixel(int);
};
constexpr pixel::pixel(int a)
: x(a), y(x)
{ square(x); }
constexpr pixel small(2); // error: square not defined, so small(2)
// is not constant so constexpr not satisfied
constexpr void square(int &x) { // OK: definition
x *= x;
}
解决方案是将square
的定义移到small
声明之上。
从上面我们可以得出结论,转发声明constexpr
函数是好的,但是它们的定义必须在之前首次使用时才可用。