在 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) 表达式验证以下条件:
限制:
由于由于“潜在评估”表达式的保守性质,可能存在 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中文网其他相关文章!