相关疑难解决方法(0)

C++20模板lambas的限制和使用

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

传入的 C++20引入了模板 lambdas ( P0428R2 )。

所以代替

auto x = [](auto x, auto y){ return x+y; };
Run Code Online (Sandbox Code Playgroud)

我们可以指定模板参数如下

auto x = []<typename T>(T x, T y){ return x+y; };
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。

第一个问题:模板 lambda 中的显式模板参数是否只能从参数中推导出来,或者是否可以添加非推导出的模板参数?

阅读 P0428r1 我没有看到任何明确的限制,但是,我也没有看到非推导模板参数的例子。

在第一个近似值中,我认为非推导的模板参数是合法的,因为我看到以下愚蠢的代码

int main()
 {   
   []<int = 0>(){ }();
 }
Run Code Online (Sandbox Code Playgroud)

使用 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); };
Run Code Online (Sandbox Code Playgroud)

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

我试过

x<0u>(y);
Run Code Online (Sandbox Code Playgroud)

但 …

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

7
推荐指数
1
解决办法
273
查看次数

带有非类型模板参数的 C++20 lambda

我正在处理新的 C++20 lambda,似乎我可以声明一个采用非类型模板参数的 lambda,但是我无法调用它。

#include <iostream>

int main() {

    // compiles fine
    auto f = []<bool ok>() { return ok; };

    // it even has an address??
    std::cout << &f;

    // f();    // error : no matching function for call to object of typ
    // f<true>(); // error : invalid operands to binary expression

    f.operator()<true>(); // compiles but somewhat... ugly
}
Run Code Online (Sandbox Code Playgroud)

我在这里查看了相关论文但似乎没有提到这种情况下的调用语法。

是否禁止在 lambda 调用站点显式传递模板参数?这将是一个令人失望的限制,因为我认为目的是让 lambda 能够像模板一样做很多事情。

c++ lambda templates c++20

4
推荐指数
1
解决办法
134
查看次数

标签 统计

c++ ×2

c++20 ×2

lambda ×2

generic-lambda ×1

language-lawyer ×1

templates ×1