C++0x 中的 Lambda:错误:请求从非标量类型转换为非标量类型
Lambda in C++0x: error: conversion from to non-scalar type requested
我在编译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'
明吉瓦 4.6.1
您尝试将 lambda 分配给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}
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 ^^
来自 C++11 标准,5.1.2.2(由我缩短)
lambda 表达式的类型(也是闭包对象的类型)是一种唯一的、未命名的非联合类类型(称为闭包类型),其属性如下所述。[更多文字如下]
所以,其他人说的,QString
和lambda的类型是不兼容的。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 请求从"点*"转换为非标量类型"点"
- 错误:在 C++ 中从 'Counter' 转换为非标量类型'CountDn'
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 在 opencv 上将 vec 类型转换为标量类型
- 为矢量对象请求转换为非标量类型
- 错误:请求从 std::chrono::time_point 浮点数转换为非标量类型长整型
- 此错误的含义是什么:从 'char* [40] 转换为非标量类型 'std::string
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"
- 请求从非标量类型"node*"转换为标量类型 "node"
- 将标量乘以boost.units.quantity(自动类型转换问题?)
- 迭代器错误从非标量类型转换为非标量类型
- C++简单的矢量程序中从 int 类型转换为非标量类型
- 请求C++从非标量类型转换为非标量类型
- C++0x 中的 Lambda:错误:请求从非标量类型转换为非标量类型
- 请求从非标量类型转换为非标量类型
- 请求从非标量类型转换为非标量类型(功能)