C++ C++;20具有非类型模板参数的lambda
我正在摆弄新的C++20 lambda,似乎我可以声明一个lambda接受一个非类型模板参数,但是我不能调用它C++ C++;20具有非类型模板参数的lambda,c++,templates,lambda,c++20,C++,Templates,Lambda,C++20,我正在摆弄新的C++20 lambda,似乎我可以声明一个lambda接受一个非类型模板参数,但是我不能调用它 #包括 int main(){ //编撰精良 自动f=[](){返回ok;}; //它甚至有一个地址?? 标准::cout 是否禁止在lambda调用站点显式传递模板参数 不,但问题是您没有为正确的实体指定模板参数。请注意,f本身不是模板。它是一个非模板类型的对象,包含模板化的成员操作符() 所以当你这样做的时候: f<true>(); // error 很好,因为您正在
#包括
int main(){
//编撰精良
自动f=[](){返回ok;};
//它甚至有一个地址??
标准::cout
是否禁止在lambda调用站点显式传递模板参数
不,但问题是您没有为正确的实体指定模板参数。请注意,f
本身不是模板。它是一个非模板类型的对象,包含模板化的成员操作符()
所以当你这样做的时候:
f<true>(); // error
很好,因为您正在为确实是模板的f
的操作符()
指定模板参数
此外,此问题与lambda的非类型模板参数无关,如果它也是类型模板参数,也会发生同样的情况。一种可能是直接在lambda内部调用函数模板:f.operator()();
。不确定是否还有其他方法。@tkausl,很好,我没有想到它是这样工作的:)如果lambda本身,即函数对象,无法参数化,我想知道标准是否可以将f()
定义为f.operator()的一种语法糖()
@plexando我看不出任何不起作用的理由。但是,这将是一条附加规则,我认为没有多大好处。@plexando:f(1)
已经是(f1
的意思,当f
是一个值(不是一个模板)时。@DavisHerring好吧,就是这样:)我甚至没想到:)@Davis Herring:)是的,先生(瑞德)海岭。我一直想知道谁是幕后黑手:。
f.operator()<true>(); // ok