C++中的Lambda 0x:错误:从请求转换为非标量类型

And*_*i R 3 c++ lambda qt

我在编译lambda函数时遇到了问题:

... (int level = 3) ...
QString str = [level] {QString s;for(int i=0;i++<level;s.append(" "));return s;};
Run Code Online (Sandbox Code Playgroud)

错误内容:

error: conversion from 'GainStatistic::getWidgetAndProps(QObject*, int)::<lambda()>' to non-scalar type 'QString' requested
Run Code Online (Sandbox Code Playgroud)

我试过这个变种:

... (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()>)'
Run Code Online (Sandbox Code Playgroud)

但是函数中的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
Run Code Online (Sandbox Code Playgroud)

另一个变种:

QString str = [level]->QString {QString s;for(int i=0;i++<level;s.append(" "));return s;};

error: expected token ';' got 'str'
Run Code Online (Sandbox Code Playgroud)

MinGW 4.6.1

pmr*_*pmr 12

您尝试将lambda指定给a QString.你期望发生什么?不带参数的lambda是一个无效的函数.您需要调用它来获取其返回值.

例如

int x = [] { return 23; }();
                         ^^
                        call
Run Code Online (Sandbox Code Playgroud)

另外,感谢您向我展示无参数lambda的语法.我不知道这是可能的.我也有点不确定它是否真的合法.

编辑:这是合法的.5.1.2

lambda-expression:
    lambda-introducer lambda-declarator{opt} compound-statement

lambda-declarator:
    (parameter-declaration-clause) mutable{opt}
Run Code Online (Sandbox Code Playgroud)