为什么在constexpr表达式中使用constexpr函数之前必须定义constexpr函数?

时间:2015-08-11 16:17:06

标签: c++ c++11 const

以下代码编译正常并成功运行。

#include <iostream>

constexpr int f();

int main()
{
    int a = f();
    std::cout << a << "\n";

    // error: ‘constexpr int f()’ used before its definition
    // constexpr int b = f();
    // std::cout << b << "\n";
}

constexpr int f()
{
    return 10;
}

这是输出。

$ g++ -std=c++11 foo.cpp && ./a.out 
10

但是当我在注释中取消注释两行代码时,我收到了这个错误。

$ g++ -std=c++11 foo.cpp && ./a.out 
foo.cpp: In function ‘int main()’:
foo.cpp:11:25: error: ‘constexpr int f()’ used before its definition
     constexpr int b = f();
                     ^

我知道通过在constexpr int f()之前移动main()的定义,我可以很容易地摆脱这个错误。

以下是我的问题:

  1. 为什么必须在constexpr表达式中使用constexpr函数之前定义constexpr函数?
  2. 为什么在constexpr使用constexpr之前声明constexpr功能还不够?
  3. 为什么编译器无法确定constexpr函数的定义位置,就像在非constexpr函数或非constexpr函数中使用{ {1}}表达?
  4. 为什么在非constexpr表达式中使用它后定义{{1}}函数是否可以?

0 个答案:

没有答案