constexpr功能必须向前定义?

时间:2017-01-14 07:03:39

标签: c++ constexpr

看下面的代码,f()定义如下主要功能被视为格式错误? 有人能给我一个解释吗?

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
}

2 个答案:

答案 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函数是好的,但是它们的定义必须在之前首次使用时才可用。