Lambda 语法或 gcc 错误的最后一分钟更改

Last minute change in Lambda syntax or gcc bug?

本文关键字:最后一分钟 错误 语法 gcc Lambda      更新时间:2023-10-16

我使用 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括起来。(当然,这个答案是基于草稿的,所以不排除语法后期更改的可能性。