C++20 模板 lambas 的限制和使用
limits and uses of C++20 template lambas
C++ 标准专家的几个相关问题。
传入C++20introduces template lambdas (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); };
在调用这样的 lambdas 时是否有一些语法来指定模板参数 I
而 显式命名 operator()
?
我试过
x<0u>(y);
但是 <
被解释为关系运算符。
我试过简单地添加 template
x template <0u>(y);
但是没用。
lambda 函数中的模板 headers 没有特殊限制。 Lambdas 毕竟只是 shorthand 你可以用任何 operator()
重载做的事情。
在调用 lambda 函数的 operator()
时,没有提供模板参数的特殊语法。如果您有未推导的模板参数,则必须使用传统机制来提供这些模板参数。即:lamb.operator()<Args>(...)
.
非推导的 lambda 模板参数是合法的。调用它们的语法类似于方法调用相同 class 的重载运算符时所需的现有函数符号;特别是如果它是一个重载的运算符模板。
我在下面的示例中展示了最详细的组合,其中 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++ 标准专家的几个相关问题。
传入C++20introduces template lambdas (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); };
在调用这样的 lambdas 时是否有一些语法来指定模板参数 I
而 显式命名 operator()
?
我试过
x<0u>(y);
但是 <
被解释为关系运算符。
我试过简单地添加 template
x template <0u>(y);
但是没用。
lambda 函数中的模板 headers 没有特殊限制。 Lambdas 毕竟只是 shorthand 你可以用任何 operator()
重载做的事情。
在调用 lambda 函数的 operator()
时,没有提供模板参数的特殊语法。如果您有未推导的模板参数,则必须使用传统机制来提供这些模板参数。即:lamb.operator()<Args>(...)
.
非推导的 lambda 模板参数是合法的。调用它们的语法类似于方法调用相同 class 的重载运算符时所需的现有函数符号;特别是如果它是一个重载的运算符模板。
我在下面的示例中展示了最详细的组合,其中 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;
}