限制和使用 C++20 模板兰巴
limits and uses of C++20 template lambas
本文关键字:C++20 更新时间:2023-10-16
C++标准大师的几个相关问题。
传入的 C++20 引入了模板 lambda (P0428R2(。
所以而不是
auto x = [](auto x, auto y){ return x+y; };
我们可以指定模板参数如下
auto x = []<typename T>(T x, T y){ return x+y; };
目前为止,一切都好。
第一个问题:模板 lambda 中的显式模板参数只能从参数中推导,还是可以添加非推导的模板参数?
阅读 P0428r1 我没有看到任何明确的限制,但也没有看到非推导模板参数的示例。
在第一个近似中,我认为非推导的模板参数是合法的,因为我看到以下愚蠢的代码
int main()
{
[]<int = 0>(){ }();
}
使用 G++(10.0.0 头(和CLang++(10.0.0 头(编译和运行。
假设允许使用非推导模板参数,第二个问题是:如何在提供模板参数的同时调用模板 lambda?
通过示例:给定以下模板 lambda
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
是否有一些语法可以在调用此类 lambda 时指定模板参数I
而不显式命名operator()
?
我试过
x<0u>(y);
但<
被解释为关系运算符。
我试过简单地添加template
x template <0u>(y);
但它不起作用。
lambda 函数中的模板标头没有特殊限制。毕竟,Lambda 只是您在任何operator()
过载的情况下已经可以做的事情的简写。
在调用 lambda 函数的operator()
时,没有用于提供模板参数的特殊语法。如果您有未推导的模板参数,则必须使用传统的机制来提供这些模板参数。IE:lamb.operator()<Args>(...)
.
非推导的 lambda 模板参数是合法的。调用它们的语法类似于方法调用同一类的重载运算符时所需的现有函数表示法;特别是如果它是一个重载的运算符模板。
我在下面的示例中展示了最详细的组合,其中template
关键字也是必需的,因为 lambda 具有依赖名称:
#include <tuple>
template <typename T>
void test()
{
std::tuple tup{42, "eggs"};
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
int i = x.template operator()<0>(tup);
}
int main(int argc, char *argv[])
{
test<float>();
return 0;
}
相关文章:
- 用C++20 fmt限制结果的总大小
- 如何在C++20中创建模板别名的推导指南
- 实施具有 C++20 概念的配对概念
- C++20概念:需要运算符重载
- 为什么在C++20中对lambdas使用"std::bind_front"
- 填孔方法需要20分钟以上
- c++20[[no.unique_address]]中的新功能是什么
- 如何在 C++20 计时中为日期添加天数?
- 必须为 C++20 协程帧保留多少内存?
- C++20 概念:如何在"requires"子句中引用类名?
- 在C++中随机生成 20 个非重复数字
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++20 协程:需要一个使用 co_yield 的函数
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将 C++20 范围与istreambuf_iterator一起使用
- 使用文件系统时仍然需要链接到带有 C++20 的 stdc++fs?
- 在 C++20 中将多个范围适配器连接到一个范围中
- C++20 使用 Visual Studio 编译模块:不编译或导入 ixx 文件
- 标准::累积C++20版本
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?