c++ - 可以使用模板进行 consteval 吗?
问题描述
我正在尝试制作一些 consteval 函数的模板版本,我不清楚这里是否有任何限制。
template <typename T>
consteval T max(const T& a, const T& b) {
return (a > b) ? a : b;
}
template <typename T>
consteval T mid(const T& a, const T& b, const T& c) {
T m = max(max(a, b), c);
if (m == a)
return max(b, c);
if (m == b)
return max(a, c);
return max(a, b);
}
consteval int imax(const int& a, const int& b) {
return (a > b) ? a : b;
}
consteval int imid(const int& a, const int& b, const int& c) {
int m = imax(max(a, b), c);
if (m == a)
return imax(b, c);
if (m == b)
return imax(a, c);
return imax(a, b);
}
大多数情况下工作正常 -
std::cout << imax(1,2) << std::endl;
std::cout << imid(1,2,3) << std::endl;
std::cout << max(1,2) << std::endl; // templated version works fine
我再次看到依赖于 consteval 函数的模板版本的编译错误。具体来说,这个用例无法编译
std::cout << mid(1,2,3) << std::endl; // templated version fails to compile
错误 -
FAILED: out.p/main.cpp.o
clang++-12 -Iout.p -I. -I.. -fcolor-diagnostics -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Wpedantic -std=c++2a -O0 -g -MD -MQ out.p/main.cpp.o -MF out.p/main.cpp.o.d -o out.p
/main.cpp.o -c ../main.cpp
../main.cpp:11:11: error: call to consteval function 'max<int>' is not a constant expression
T m = max(max(a, b), c);
解决方案
正如@cigien 所指出的,这确实是一个clang 错误。它适用于 gcc。
推荐阅读
- javascript - 当我没有看到 api 结果时,我需要显示未找到数据
- c# - QuickFix/n - 登录内的自定义字段
- angular - Karma - 注入 Angular InjectionToken 问题
- c# - C# 对委托类型的泛型类型推断
- angular - Angular 等待 Promise 导致变量在模板中显示
- git - 如何在 package-lock.json 文件中正确更新 mem 包
- python - python多线程中的并发性与并行性?
- mysql - 计算移动平均线作为子查询
- c# - 如何根据方向更改 Grid.RowDefinitions
- project-management - 如何为关键跟踪器创建客户状态?