在 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;
}
最佳答案
不。
无论论文将带来什么变化,这都是很小的 at this point ,它不能改变非模板函数定义只输入一次的事实。此外,如果您提出的代码是合法的,我们大概可以找到一种方法来声明 std::integral_constant<int, i>
类型的变量。 ,这在 ODR 方面感觉非常令人望而却步。
该论文还指出,在其中一个示例中,不打算将参数视为核心常量表达式;
consteval int sqrsqr(int n) {
return sqr(sqr(n)); // Not a constant-expression at this point,
} // but that's okay.
简而言之,由于可能存在类型差异,函数参数永远不会是常量表达式。
关于c++ - consteval 函数是否允许依赖于函数参数的模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59544519/