相关疑难解决方法(0)

它是一个符合标准的编译器扩展,将非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()
{
}
Run Code Online (Sandbox Code Playgroud)

的上面使用的标准库函数都不是constexpr功能,我们允许使用它们,其中一个常量表达式从两个需要草案C++ 11标准草案C++ 14标准7.1.5 [dcl.constexpr] :

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

即使使用-std=c++14 -pedantic-std=c++11 -pedantic没有生成警告(请参见实时).使用-fno-builtin产生错误(参见实时),表明这些标准库函数的内置版本被视为constexpr

虽然 …

c++ gcc language-lawyer c++11 c++14

38
推荐指数
1
解决办法
2952
查看次数

在constexpr中使用argc,是否严格要求所涉及的任何子表达式都是常量表达式?

例:

int main(int argc, char**)
{
    constexpr int a = argc * 0;
    (void)a;
    constexpr int b = argc - argc;
    (void)b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

argc不是常量表达式,但编译器仍能够在两种情况下计算结果ab编译时间(即0).

g ++接受上面的代码,而clang和MSVC14拒绝它.

标准是否允许编译器与g ++一样聪明constexpr

c++ gcc language-lawyer constexpr c++11

7
推荐指数
1
解决办法
247
查看次数

标签 统计

c++ ×2

c++11 ×2

gcc ×2

language-lawyer ×2

c++14 ×1

constexpr ×1