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函数,即使标准没有明确要求它们。我本来期望至少在严格的一致性模式下收到警告,这是一个符合要求的扩展吗?