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/