它是一个符合标准的编译器扩展,将非constexpr标准库函数视为constexpr吗?

时间:2015-01-02 14:58:25

标签: c++ c++11 gcc language-lawyer c++14

gcc在没有警告的情况下编译以下代码:

#include <cmath>

struct foo {
  static constexpr double a = std::cos(3.);
  static constexpr double c = std::exp(3.);
  static constexpr double d = std::log(3.);
  static constexpr double e1 = std::asin(1.);
  static constexpr double h = std::sqrt(.1);
  static constexpr double p = std::pow(1.3,-0.75);
};

int main()
{
}

上面使用的标准库函数都不是 constexpr函数,我们可以使用the draft C++11 standard和{{em}常量表达式。 {3}}部分7.1.5 [dcl.constexpr]

  

[...]如果它是由构造函数调用初始化的,则该调用应为a   常数表达式(5.19)。否则,或者如果constexpr说明符是   在引用声明中使用,每个完整的表达式出现在   它的初始化程序应该是一个常量表达式。[...]

即使使用-std=c++14 -pedantic-std=c++11 -pedantic,也不会生成任何警告( draft C++14 standard )。使用-fno-builtin会产生错误( see it live ),表明这些标准库函数的see it live版本被视为 constexpr

虽然clang不允许带有任何标志组合的代码,但我已尝试过。

所以这是一个gcc扩展来处理至少一些内置函数,好像它们是 constexpr函数,即使标准没有明确要求它们。我本来期望至少在严格的一致性模式下收到警告,这是一个符合要求的扩展吗?

0 个答案:

没有答案