具有模板参数而非函数参数的Lambda函数

Cha*_*eon 8 c++ lambda templates 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
}
Run Code Online (Sandbox Code Playgroud)

我之所以使用它,是因为该表达式在代码中多次重复。

当然,我可以使用真实的函数模板,但是我很好奇。

Bar*_*rry 10

This is easier to understand if you consider what the equivalent class type looks like to your get1:

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

get1_t get1;

get1<5>(); // error
Run Code Online (Sandbox Code Playgroud)

您正在尝试为调用运算符提供一个显式的模板参数,但是从语法上讲,您正在执行为get1自己提供模板参数的操作(即好像get1是一个可变模板)。为了为调用运算符提供模板参数,您必须直接执行以下操作:

get1.operator()<5>(); // ok
Run Code Online (Sandbox Code Playgroud)

或重组呼叫运算符以采用可推论的内容:

template <int B> struct constant { };
get1(constant<5>{});
Run Code Online (Sandbox Code Playgroud)

或者将整个事物重组为实际上是看起来像是的变量模板:

template <int B>
auto get1 = [] { return B; };
Run Code Online (Sandbox Code Playgroud)

现在,get1<5>它本身就是您正在调用的lambda。也就是说,除了具有调用运算符模板的lambda之外,我们还有可变模板lambda本身不是模板。