tow*_*owi 8 c++ lambda gcc c++11
我使用gcc-4.7.0的svn版本来查看一些C++ 11的功能,例如Lambda Expressions.几个星期后,我的一些旧例子包括Lambdas不再编译了.我想知道:
有问题的代码似乎涉及直接作为参数提供的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)
据我从 n3242 草案中定义的语法来看,这段代码是有效的 C++11。Abraced_init-list由 的列表组成initializer-clause,列表可以是assignment-expressions 也可以是braced_init_lists 本身。Anassignment-expression可以是 a lambda-expression,这正是您作为第一个元素 ( [...](...){...}) 所拥有的。
因此,如果您认为可以安全地提交错误报告,则不需要用括号将 lambda 括起来:)。(当然,这个答案是基于草稿的,因此不排除语法后期更改的可能性。)
| 归档时间: |
|
| 查看次数: |
904 次 |
| 最近记录: |