它是一个符合标准的编译器扩展,将非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函数,即使标准没有明确要求它们。我本来期望至少在严格的一致性模式下收到警告,这是一个符合标准的扩展吗?
慕桂英4014372
拉风的咖菲猫
RISEBY
随时随地看视频慕课网APP
相关分类