为什么GCC在编译时不评估constexpr?

时间:2017-01-25 21:38:50

标签: c++ c++11 gcc constexpr

举个例子:

class something {
public:
  static constexpr int seconds(int hour, int min, int sec)
  { return hour*3600+min*60+sec; }
}

然后:

printf("Look at the time: %d\n", something::seconds(10, 0, 0));

将编译为使用g ++调用函数,而不是使用常数。 为什么g ++会这样做?它没有任何好处,有点挫败了使用constexpr而不是糟糕的宏的目的。

1 个答案:

答案 0 :(得分:18)

  

为什么g ++会这样做?

在结果用作常量表达式的情况下,

constexpr函数只能在编译时评估 。其中包括初始化constexpr变量和用作模板参数。

在其他情况下,即使使用自身常量表达式的参数调用constexpr函数,也可以由实现来执行它想要的操作。通常,它将取决于优化标志。例如,在gcc 6.2和clang 3.9.1上,-O0将在运行时发出调用,但-O1将发出常量36000