c++ - consteval 函数是否允许依赖于函数参数的模板参数?

标签 c++ language-lawyer constexpr c++20 class-template

在 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/

相关文章:

c++ - 为什么不是来自 std::array 双向/随机访问的 ConstexprIterator?

c++ - Clang-cl.exe 和 constexpr 深度

c++ - 无法渲染到 GtkGLArea

c++ - Visual Studio 需要为每次更改重建解决方案

c++ - 计算导致段错误的 std::vector<double> 的中值

C++11 名称在一个类的完整范围内重新评估?

c++ - Raytracer 折射错误

r - invisible() 返回的对象何时不再不可见?

c# - 为什么编译器不推断泛型类型

c++ - 当我尝试在非 constexpr 函数中运行 constexpr 函数时会发生什么?