Constexpr 处理非 constexpr 标准库函数的编译器扩展是否一致?
在 C 11 中,标准草案似乎允许处理标准库函数作为 constexpr,即使它们没有明确标记为 constexpr。然而,这种立场已经演变了。
C 14 演变
在 C 14 中,明确指出非标准要求的函数不应通过以下方式声明为 constexpr实施。 C 14 标准草案第 17.6.5.6 节对此进行了概述:
An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.
做出此决定是为了防止实现分歧,特别是 SFINAE 的使用导致不同的可观察行为。
GCC 的实现
GCC 之前处理过某些非 constexpr标准库函数作为 constexpr 基于早期的 LWG 2013 提案决议。然而,这种行为在 C 14 中不再被认为是符合的。
严格模式下警告不存在
尽管存在不符合性,GCC 不会在严格一致性模式下生成警告( -std=c 11 -迂腐)。这可能是一个疏忽,将在未来的更新中解决。
内在函数豁免
编译器内在函数不受与标准库函数相同的规则的约束。因此,使用像这样的内部函数:
static constexpr double a = __builtin_cos(3.);
应该被认为是符合的。
结论
目前将非 constexpr 标准库函数视为 constexpr C 14 中的不合格扩展。虽然 GCC 根据先前的提案决议在 C 11 中允许这样做,预计此扩展将被删除或修改以符合当前的 C 14 标准。
以上是C 14 编译器能否将非 constexpr 标准库函数一致地视为'constexpr”?的详细内容。更多信息请关注PHP中文网其他相关文章!