c++ - 带有模板参数的 Lambda 函数,而不是函数参数

标签 c++ templates lambda c++20

为什么第一次调用无法编译?

auto get1 = []<int B>() { return B; };
auto get2 = []<typename B>(B b) { return b; };

int main()
{
    get1<5>(); // error: no match for operator<
    get2(5);   // ok
}

我使用它的原因是代码中多次重复的表达式。

当然我可以使用真正的函数模板,但我只是好奇为什么。

最佳答案

如果您考虑一下您的 get1 的等效类类型是什么样子,这会更容易理解。 :

struct get1_t {
    template <int B> operator()() const { return B; }
};

get1_t get1;

get1<5>(); // error

您试图向调用运算符提供显式模板参数,但从语法上讲,您正在做的事情看起来像是为 get1 提供模板参数。本身(即好像 get1 是一个变量模板)。为了为调用运算符提供模板参数,您必须直接执行此操作:

get1.operator()<5>(); // ok

或者重构调用运算符以获取可推导的内容:

template <int B> struct constant { };
get1(constant<5>{});
<小时/>

或者将整个事情重组为实际上的变量模板,就像它看起来的那样:

template <int B>
auto get1 = [] { return B; };

现在,get1<5>本身就是您正在调用的 lambda。也就是说,我们有一个本身不是模板的变量模板 lambda,而不是带有调用运算符模板的 lambda。

关于c++ - 带有模板参数的 Lambda 函数,而不是函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064451/

相关文章:

java - 如何从 C++ 启动一个 java 进程,并获取它使用的内存?

html - 如何在golang html/template中创建一个全局变量并在多个地方进行更改?

c++ - 将 C++ lambda 传递给 C 函数

c++ - std::forward of rvalue ref to lambda?

c++ - WinHTTP 中 WINHTTP_QUERY_URI 的用途?

c++ - 典型的 2D 游戏引擎

C++ Poco - 如何遍历 JSON 数组?

c++ - g++ 不喜欢模板 var 上的模板方法链接?

c++ - 推导多个参数包

lambda - 如何使用 lambda 实现 let*