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

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

Patricia Arquette
Patricia Arquette原创
2024-12-05 06:04:111024浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn