检测 C 11 中的 constexpr 表达式
在 C 11 中,确定表达式是否符合常量表达式 (constexpr) 的条件至关重要在编译时。这些知识有助于各种优化技术,并能够生成编译时计算值。
is_constexpr 的可行性
产生编译时计算值的可行性的担忧基于 C 11 表达式的 constexpr 性质的布尔值。虽然之前的 Stack Overflow 问题涉及到这个主题,但明确的答案仍然难以捉摸。
解决方案:noexcept 技巧
解决方案涉及利用 noexcept 表达式,该表达式计算如果提供的表达式包含违反 constexpr 要求的特定元素,则返回 false。这些元素包括:
通过故意制作一个函数模板 non-noexcept 并将其应用到表达式中,可以利用 noexcept(e) 表达式来检测 constexpr表达式。此方法专门识别纯右值常量表达式。
限制
必须注意与此方法相关的限制:
示例实现
以下代码片段演示了建议的解决方案:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T && t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
尽管存在局限性,但这种方法提供了对 C 11 表达式的 constexpr 性质的宝贵见解,使程序员具有更强的控制和优化能力。
以上是C 11 的'noexcept”技巧可以可靠地检测'constexpr”表达式吗?的详细内容。更多信息请关注PHP中文网其他相关文章!