首页 > 解决方案 > std::is_constant_evaluate 时如何获取常量表达式?

问题描述

让我们从示例(godbolt)开始:

constexpr int len(int v) {
    if (std::is_constant_evaluated()) {
        // static_assert(v > 0); // ERR: 'v' is not a constant expression
        return v;
    } else {
        return 0;
    }
}

using A = std::array<int, len(3)>;

问题是,static_assert不会编译(gcc / clang 最新的 10.x 版本)。显然,v没有意识到是constexprstd::is_constant_evaluated返回true。但显然,通过使用len,它实际上是。

问题:是否可以constexpr当且仅当使用变量std::is_constant_evaluated?如果是这样,怎么做?

标签: c++c++20

解决方案


显然,v没有意识到是constexprstd::is_constant_evaluated返回true。但显然,通过使用len,它实际上是。

不,实际上不是。

函数参数不是常量表达式。无论您是否正在进行持续评估,都没有关系。您不能v在任何上下文中用作常量表达式。static_assert需要一个常量表达式——这就是为什么你不能使用v.

问题:是否可以将变量用作 constexpr 当且仅当std::is_constant_evaluated?如果是这样,怎么做?

不它不是。因为为了将变量用作常量表达式,嗯,那是一个模板。并且is_constant_evaluated不能有条件地将你的函数变成函数模板,这不是编译过程可以工作的方式。见P0992


推荐阅读