Lambda语法或gcc bug的最后一刻更改?

tow*_*owi 8 c++ lambda gcc c++11

我使用gcc-4.7.0的svn版本来查看一些C++ 11的功能,例如Lambda Expressions.几个星期后,我的一些旧例子包括Lambdas不再编译了.我想知道:

  • 我是否错过了在过去几周内在gcc-4.7.0中实现的C++ 11-Lambda规范的最后一刻更改?
  • 这是gcc中的一个bug,它不再识别内联Lambda了吗?
  • 或者我是否误解了Lambda语法的其他内容?

有问题的代码似乎涉及直接作为参数提供的inline-Lambdas.

你会说下面的代码是正确的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();
}
Run Code Online (Sandbox Code Playgroud)

如果我更改它并首先将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();
}
Run Code Online (Sandbox Code Playgroud)

这里举一个例子,其中两个都用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:
           ...
Run Code Online (Sandbox Code Playgroud)

Luc*_*lle 3

据我从 n3242 草案中定义的语法来看,这段代码是有效的 C++11。Abraced_init-list由 的列表组成initializer-clause,列表可以是assignment-expressions 也可以是braced_init_lists 本身。Anassignment-expression可以是 a lambda-expression,这正是您作为第一个元素 ( [...](...){...}) 所拥有的。

因此,如果您认为可以安全地提交错误报告,则不需要用括号将 lambda 括起来:)。(当然,这个答案是基于草稿的,因此不排除语法后期更改的可能性。)