c++ - C++20 模板ambas 的限制和使用

标签 c++ lambda language-lawyer c++20 generic-lambda

C++ 标准专家的几个相关问题。

传入的 C++20 introduces模板 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 head)和 clang++(10.0.0 head)编译并运行。

假设允许非推导模板参数,第二个问题是:如何在提供模板参数的同时调用模板 lambda?

举例:给定以下模板 lambda

auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };

是否有一些指定模板参数的语法I当调用此类 lambda 时没有显式命名 operator()

我尝试过

x<0u>(y);

但是<被解释为关系运算符。

我尝试简单地添加 template

x template <0u>(y);

但它不起作用。

最佳答案

lambda 函数中的模板 header 没有特殊限制。毕竟,Lambda 只是您可以使用任何 operator() 执行的操作的简写。过载。

调用operator()时没有提供模板参数的特殊语法。的 lambda 函数。如果您有未推导的模板参数,则必须使用传统机制来提供这些模板参数。即:lamb.operator()<Args>(...) .

关于c++ - C++20 模板ambas 的限制和使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59592122/

相关文章:

c - 在编译时和运行时保证 ASCII 的最佳方法是什么?

c++ - C++ 中用户定义的文字命名

c++ - 无法在程序中指定文件路径前缀

c# - 从 c# 打开 .exe(c 程序)

c++ - 在 C++ 中使用函数装饰器(使用闭包)时出现意外的段错误

Java,为什么 collections.sort() 仍然适用于非比较器类型的参数?

c++ - QObject::connect: 需要括号,信号 QSerialPort::readyRead in ..\voltage_sensor\dialop.cpp:41

c++ - 为什么 istream、ostream、iostream、ios_base 都在这里工作

python - 将函数的参数(即 lambda)映射到元组?

c++ - 使用通用迭代器访问数组数组的元素