首页 > 后端开发 > C++ > 我的 C 11 表达式是'constexpr”吗?

我的 C 11 表达式是'constexpr”吗?

Linda Hamilton
发布: 2024-12-02 20:32:15
原创
119 人浏览过

Is My C  11 Expression a `constexpr`?

检测 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板