consteval with templates possible?(有可能使用模板吗?)
本文介绍了有可能使用模板吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试制作一些模板版本的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 bug。它和GCC相处得很好。
这篇关于有可能使用模板吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:有可能使用模板吗?
基础教程推荐
猜你喜欢
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01