Lambda 语法或 gcc 错误的最后一分钟更改
Last minute change in Lambda syntax or gcc bug?
我使用 gcc-4.7.0 的 svn 版本来查看一些 C++11 功能,例如 Lambda 表达式。几周后,我的一些旧示例(包括 Lambdas(不再编译。我想知道:
- 我是否错过了过去几周在 gcc-4.7.0 中实现的 C++11-Lambda-spec 的最后一刻更改?
- 是 gcc 中的一个错误,不再识别内联 Lambdas?
- 还是我误解了 Lambda 语法的其他内容?
有问题的代码似乎涉及直接作为参数提供的内联 Lambda。
您会说以下代码是正确的C++11代码吗?
#include <thread>
using namespace std;
struct Image {}; // dummy
void fill(int color, const Image& image) {
} // dummy
int main() {
int red;
Image img;
thread th{
[&img](int c){ fill(c, img); }, // error?
red };
th.join();
}
如果我更改它并首先将 Lambda 分配给一个变量,它可以工作:
#include <thread>
using namespace std;
struct Image {}; // dummy
void fill(int color, const Image& image) {
} // dummy
int main() {
int red;
Image img;
auto f = [&img](int c){ fill(c, img); }; // lambda
thread th{ f, red }; // ok now
th.join();
}
我在这里举了一个示例,其中两者都使用 gcc-4.5 编译(除了它引发了异常,可能是因为-pthread
没有链接(。但正如我所说:在我的 gcc-4.7.0-svn 中,第一个变体在几周前停止编译。
更新 错误消息似乎是解析错误:
In function 'int main()':
...:30:11: error: expected '=' before '(' token
...:30:12: error: expected primary-expression before 'int'
...:30:12: error: expected ')' before 'int'
...:30:36: error: no matching function for call to
'std::thread::thread(<brace-enclosed initializer list>)'
...:30:36: note: candidates are:
...
据我从草案 n3242 中定义的语法可以看出,此代码在 C++11 有效。braced_init-list
由一个initializer-clause
列表组成,这些可以是assignment-expression
,也可以是它们自己braced_init_list
s。assignment-expression
可以是lambda-expression
,这正是你作为第一个元素([...](...){...}
(所拥有的。
因此,如果认为您可以安全地:)提交错误报告,则不需要用括号将lambda括起来。(当然,这个答案是基于草稿的,所以不排除语法后期更改的可能性。
相关文章:
- 如何在最后一步使用CryptDecrypt解决NTE_BAD_DATA
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 斐波那契数列部分和的最后一位数字
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 将第 n 个斐波那契数的大斐波那契数的最后一位编程.C++
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- foor 循环的最后一次迭代中的指针更改
- 访问类成员向量最后一项的正确方法
- 从函数参数包中删除最后一项
- C++ 查找算法:如何找到元素的最后一次出现?
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 如何找到由公式计算的非常大的数字的最后一位数字?
- 在 QSet 中插入元素<QString>并检索 ,删除 QSet 的最后一项
- 为什么除了最后一帧之外,每一帧都没有调用命令
- X 变量在最后一次尝试简单猜谜游戏时发生变化,C++
- C++ 最后一列中的直方图错误
- 仅当捕获组最后一次出现时,才使字符成为可选字符
- Lambda 语法或 gcc 错误的最后一分钟更改
- 指数的最后一位——答案错误
- ' std::sin '的最后一位是错误的