首页 >后端开发 >C++ >GCC 是否允许在 Constexpr 上下文中使用非 Constexpr 标准库函数?

GCC 是否允许在 Constexpr 上下文中使用非 Constexpr 标准库函数?

Barbara Streisand
Barbara Streisand原创
2024-11-29 20:03:12314浏览

Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?

非 Constexpr 标准库函数可以在 GCC 中被视为 Constexpr 吗?

GCC 编译用非 constexpr 初始化静态 constexpr 变量的代码不发出警告的标准库函数,例如示例中的函数下面:

#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);
};

根据 C 11 和 C 14 标准,非 constexpr 函数不能在常量表达式中使用。然而,GCC 将一些内置标准库函数视为 constexpr,即使它们没有明确标记为 constexpr。

此行为是 C 14 中的不合格扩展。C 14 标准草案禁止以下实现除非明确要求,否则将标准库函数签名声明为 constexpr。

在 C 11 中,共识从允许此扩展转变为禁止它。这是因为不同的实现以不同的方式处理函数可能会导致使用 SFINAE 时的行为差异。

GCC 最初依赖于早期提出的 LWG 问题 2013 的解决方案,该解决方案允许实现将任何函数声明为 constexpr(如果它满足某些条件)限制。这就是为什么 GCC 在严格一致性模式下将这些函数视为 constexpr。

但是,C 14 中的分辨率发生了变化,该扩展现在被认为是不合格的。 GCC 预计会解决此问题,并发出警告或在严格一致性模式下禁用此行为。

请注意,此问题不涵盖编译器内在函数,因此应允许在 constexpr 上下文中使用它们。

以上是GCC 是否允许在 Constexpr 上下文中使用非 Constexpr 标准库函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn