3

我在编译 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

4

3 回答 3

12

您尝试将 lambda 分配给 a QString。你期望会发生什么?不带参数的 lambda 是一个空函数。你需要调用它来获取它的返回值。

例如

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}
于 2012-05-07T09:21:32.307 回答
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 ^^   
于 2012-05-07T09:24:38.077 回答
0

来自 C++11 标准,5.1.2.2(由我缩短)

lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型 - 称为闭包类型- 其属性如下所述。[更多文字如下]

所以,其他人说QString的和 lambda 的类型是不兼容的。

于 2012-05-07T09:28:11.617 回答