首页 > 后端开发 > C++ > C 11 能否确定表达式是否为编译时常量?

C 11 能否确定表达式是否为编译时常量?

Patricia Arquette
发布: 2024-12-05 06:04:11
原创
997 人浏览过

Can C  11 Determine if an Expression is a Compile-Time Constant?

constexpr 在 C 11 中可能吗?

问题:

C 11 能否确定是否表达式是编译时常量表达式(constexpr)?

答案:

是的,可以使用以下技术根据此确定生成编译时布尔值:

template<typename T> 
constexpr typename remove_reference<T>::type makeprval(T &&& t) {
  return t;
}

#define isprvalconstexpr(e) noexcept(makeprval(e))
登录后复制

该宏使用 noexcept 运算符检查表达式 e 是否是纯右值常量表达式。如果 noexcept(makeprval(e)) 计算结果为 true,则表达式 e 是纯右值常量表达式。

说明:

纯右值常量表达式有一定的限制:

  • 函数调用必须不抛出异常异常规范。
  • 禁止抛出表达式。
  • 动态转换和 typeid 表达式必须采用不可抛出的形式。

未声明 makeprval 函数as noexcept,因此如果 e 是纯右值常量表达式,则调用 makeprval(e) 将是常量表达式。因此,noexcept 运算符将返回 true。

限制:

isprvalconstexpr 宏有一些限制:

  • 它可能会产生漏报在表达式是常量表达式但子表达式可能被计算但实际上未被计算的情况下评估。
  • 它只检查纯右值常量表达式,而不检查一般的 constexpr 表达式。

以上是C 11 能否确定表达式是否为编译时常量?的详细内容。更多信息请关注PHP中文网其他相关文章!

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