它是一个符合标准的编译器扩展,将非constexpr标准库函数视为constexpr吗?
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功能,我们允许使用它们,其中一个常量表达式从两个需要草案C ++ 11标准和草案C ++ 14标准部7.1.5
[dcl.constexpr] :
[...]如果它是由构造函数调用初始化的,那么该调用应该是一个常量表达式(5.19)。否则,或者如果在引用声明中使用constexpr说明符,则其初始值设定项中出现的每个完整表达式都应为常量表达式。[...]
即使使用-std=c++14 -pedantic
或-std=c++11 -pedantic
没有生成警告(请参见实时)。使用-fno-builtin
产生错误(参见实时),表明这些标准库函数的内置版本被视为constexpr
虽然clang
不允许使用任何标志组合的代码我尝试过。
所以这是一个gcc
扩展来处理至少一些内置函数,好像它们是constexpr函数,即使标准没有明确要求它们。我本来期望至少在严格的一致性模式下收到警告,这是一个符合标准的扩展吗?
拉风的咖菲猫
RISEBY
相关分类