【发布时间】:2020-04-20 00:10:55
【问题描述】:
在 C++17 中,这段代码是非法的:
constexpr int foo(int i) {
return std::integral_constant<int, i>::value;
}
这是因为即使foo 可以在编译时求值,编译器仍然需要在运行时生成指令来执行它,因此无法进行模板实例化。
在 C++20 中,我们将拥有 consteval 函数,这些函数需要在编译时进行评估,因此应该删除运行时约束。这是否意味着该代码将是合法的?
consteval int foo(int i) {
return std::integral_constant<int, i>::value;
}
【问题讨论】:
-
AFAIK,没有。
i在那一刻(还)不被视为核心常量表达式。 -
cppreference 具有 consteval 说明符将函数或函数模板声明为立即函数 [...] 立即函数是 constexpr 函数,并且必须满足适用于 constexpr 函数或constexpr 构造函数,视情况而定。 所以标志指向否。我对标准的阅读使我得出相同的结论,但我不确定在答案中说明这一点。
-
这个问题正在meta讨论。
标签: c++ language-lawyer constexpr c++20 class-template