检测 C 11 中的常量表达式
在 C 11 中,可以在以下期间确定表达式是否为常量表达式 (constexpr)编译,这有利于优化代码和确保某些属性。
使用noexcept(makeprval(e))
确定表达式是否为常量表达式的一种方法是使用以下宏:
#define isprvalconstexpr(e) noexcept(makeprval(e))
其中 makeprval 是一个模板函数,将对表达式的引用作为输入并返回相同的纯右值type.
说明
如果 e 包含常量表达式中不允许的某些操作,例如非抛出函数调用,则 noexcept(e) 表达式返回 false,抛出表达式,以及可抛出的动态转换或 typeid。如果调用 makeprval 不是常量表达式,则 noexcept 表达式也会返回 false。
限制
虽然 isprvalconstexpr 通常在检测纯右值常量表达式方面很有效,但它有一个微妙的限制。如果表达式是常量表达式,但包含常量表达式中不允许的潜在计算子表达式,则可能会给出假阴性。
示例用法
以下示例演示 isprvalconstexpr 的用法:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
在此示例中,atest 为 false,因为表达式 (0 ? throw "fooled!" : 42) 不是常量表达式,即使 a 的初始化成功。这是因为“邪恶”非常量子表达式抛出“愚弄!”可能会被评估,即使在这种特定情况下从未实际评估过。
以上是我的 C 11 表达式是'constexpr”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!