首页 >后端开发 >C++ >我们可以在没有声明的编译时确定 C 11 表达式是否为'constexpr”吗?

我们可以在没有声明的编译时确定 C 11 表达式是否为'constexpr”吗?

Susan Sarandon
Susan Sarandon原创
2024-12-02 12:58:11963浏览

Can We Determine if a C  11 Expression is `constexpr` at Compile Time Without Declarations?

在 C 11 中使用 constexpr:确定常量表达式

问题:

是否可行确定 C 11 表达式是否符合常量表达式的条件(constexpr) 在编译时不依赖声明?

答案:

利用 noexcept 运算符,可以构造一个编译时布尔值,指示是否表达式构成constexpr:

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

#define isprvalconstexpr(e) noexcept(makeprval(e))

解释:

noexcept(e) 表达式验证以下条件:

  • 不存在函数调用具有不抛出异常规范或不构成常量表达式的变量调用。
  • 否存在“抛出”表达式。
  • 没有可抛出形式的动态转换或 typeid。

限制:

由于由于“潜在评估”表达式的保守性质,可能存在 noexcept 可能提供假阴性的情况。例如:

constexpr int a = (0 ? throw "fooled!" : 42);
constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42)); // returns false

在这种情况下,a 已成功初始化,但 atest 的计算结果为 false,因为 throw 表达式可能会被计算,即使它从未被执行。

以上是我们可以在没有声明的编译时确定 C 11 表达式是否为'constexpr”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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