确定 C 11 中的 Constexpr 表达式
问题:是否可以确定 C 11 表达式是否为常量表达式 (constexpr) at编译时?
答案: 是的,可以使用以下技术:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T&& t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
解释:
isprvalconstexpr 宏接受一个表达式 e,如果 e 是纯右值常量表达式(即,它可以在编译时评估)。这是通过使用 noexcept 运算符来确定的,如果 e 包含任何可能评估的函数调用,而这些函数调用不具有非抛出异常规范、抛出表达式或可抛出的动态强制转换或 typeids,则该运算符返回 false。
局限性:
值得注意的是,这种技术有一个局限性。 noexcept 运算符有时会给出漏报,这意味着它可能会报告表达式不是常量表达式,尽管它是常量表达式。当 e 中的“潜在评估”表达式并未实际评估时,就会发生这种情况,在某些情况下,即使它们被正式视为可能评估,也会发生这种情况。
以上是我们如何在编译时确定 C 11 表达式是否为'constexpr”?的详细内容。更多信息请关注PHP中文网其他相关文章!