我在编译lambda函数时遇到了问题:
... (int level = 3) ...
QString str = [level] {QString s;for(int i=0;i++<level;s.append(" "));return s;};
错误内容:
error: conversion from 'GainStatistic::getWidgetAndProps(QObject*, int)::<lambda()>' to non-scalar type 'QString' requested
我尝试过这种变体:
... (int level = 3) ...
QString str ([level] {QString s;for(int i=0;i++<level;s.append(" "));return s;});
error: no matching function for call to 'QString::QString(GainStatistic::getWidgetAndProps(QObject*, int)::<lambda()>)'
但是函数中的lambda表达式只是某种类型的值?是对的吗?因此,QString(lambda-that-returns-QString)
必须调用QString::QString(const QString& ref)
构造函数,这必须有效:
... (int level = 3) ...
QString str([level] {const QString& ref = "123";return ref;}); //leads to the same error
另一种变体:
QString str = [level]->QString {QString s;for(int i=0;i++<level;s.append(" "));return s;};
error: expected token ';' got 'str'
MinGW 4.6.1
答案 0 :(得分:12)
您尝试将lambda分配给QString
。你期望发生什么?不带参数的lambda是一个无效的函数。您需要调用它来获取其返回值。
e.g。
int x = [] { return 23; }();
^^
call
另外,感谢您向我展示无参数lambda的语法。我不知道这是可能的。我也不确定它是否真的合法。
修改:这是合法的。 5.1.2
lambda-expression:
lambda-introducer lambda-declarator{opt} compound-statement
lambda-declarator:
(parameter-declaration-clause) mutable{opt}
答案 1 :(得分:2)
Lambda是具有基本结构[capture](arguments){code}
的匿名函数。你没有将参数传递给你的lambda。我想你想要
QString str = [](int x){QString s;for(int i=0;i++<x;s.append(" "));return s;} (level);
// ^^ lambda starts here argument to lambda ^^
答案 2 :(得分:0)
来自C ++ 11标准,5.1.2.2(由我缩短)
lambda-expression 的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述。 [更多文字如下]
所以,其他人说,QString
和lambda的类型是不相容的。