将非 constexpr 标准库函数视为 Constexpr:一致性分析
问题是编译器扩展是否处理非 constexpr 标准constexpr 的库函数是一致的。尽管 C 11 标准草案允许此类处理,但随后的发展澄清了这一问题。
C 14 明确禁止
在 C 14 中,标准草案第 17.6.5.6 节明确指出,除非明确指出,否则实现不得将任何标准库函数签名声明为 constexpr 必需的。该裁决禁止将非 constexpr 标准库函数视为 constexpr。
GCC 扩展
GCC 实现了一个将某些内置函数视为 constexpr 的扩展。然而,根据更新的 C 14 标准,此扩展被认为是不符合标准的。
As-if 规则和可观察行为
最初不清楚 as- if 规则允许将非 constexpr 函数视为 constexpr。假设规则允许实现偏离标准的要求,只要它们产生等效的可观察行为。但是,更改函数的 constexpr 状态会影响可观察的行为,如 SFINAE 测试所示,使用相同的代码时,其行为会有所不同。
符合缓解措施
为了使符合 GCC 扩展,编译器需要在严格一致性模式下发出警告(例如,-std=c 11 -pedantic)当在 constexpr 上下文中使用非 constexpr 标准库函数时。
内在函数异常
编译器内在函数不包含在标准中,可以免除 constexpr 函数规则。使用内置内在函数(例如 __builtin_cos)作为 constexpr 可能是被允许的。
以上是将非 constexpr 标准库函数视为'constexpr”符合 C 标准吗?的详细内容。更多信息请关注PHP中文网其他相关文章!