为什么第一次调用不能编译?
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; };
Now, get1<5>
本身就是您正在调用的 lambda。也就是说,我们有一个本身不是模板的变量模板 lambda,而不是带有调用运算符模板的 lambda。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)