为何可在Lambda表达式捕获列表中命名Lambda,外部却不行?
为什么Lambda初始化捕获可行,但直接使用未定义类型的初始化会失败?
第一个示例可行的原因
你写的这段代码用的是C++14引入的Lambda初始化捕获语法:
[lambda1{[](){ return 123; }}]{ return lambda1(); }();
Lambda捕获列表里的lambda1{[](){return 123;}},是在Lambda的闭包对象内部直接初始化一个名为lambda1的成员变量,这个变量的类型就是内部嵌套的那个小Lambda的闭包类型。这种初始化方式是C++标准明确允许的,编译器能正确识别并处理,后续在Lambda体里调用lambda1()完全合法,最后加()调用外层Lambda就能得到返回值123。
第三个示例无法运行的原因
这段代码的核心问题是prova是未定义的标识符:
cout << prova{[](){ return "hello"; }}();
你从来没有声明过prova是类、结构体、类型别名或者其他任何合法的C++类型,编译器根本不知道prova代表什么,直接就会抛出“未定义类型”的编译错误。退一步讲,就算你提前定义了prova类型(比如一个结构体),如果这个类型没有重载operator()(函数调用运算符),后面的()也无法调用prova对象,同样会编译失败。
内容的提问来源于stack exchange,提问作者Lorenzo Spada
相关产品推荐
相关产品推荐

