统一初始化中的广义lambda捕获无法编译

时间:2014-04-04 09:22:17

标签: c++ c++14

为什么这段代码无法编译?我正在使用clang 3.4和-std=c++1y

struct Foo {
    template <class T>
    Foo(T) {}
};

void bar()
{
    std::vector<int> vec;
    auto func = [vec{std::move(vec)}] () { };
    Foo f1 { func};  // compile
    Foo f2 { [vec] () { } }; // compile
    Foo f3 { [vec{std::move(vec)}] () {} }; // failed to compile
}

error message and flags

1 个答案:

答案 0 :(得分:1)

这是一个Clang错误,由C ++ 14 lambda init-captures和C99指定初始化程序之间的交互引起。

C99的指定初始值设定项包括以下语法:

int arr[] = { [2] = 42 };

Clang支持它们作为C ++和C中的扩展,因此当它在[中看到{ ... }时,它需要弄清楚它是否是一个开头 lambda-expression 或数组指示符(或属性说明符,或者在Objective C ++ 11中,是一个消息发送表达式)。

不幸的是,当Clang获得对C ++ 1y init-captures 的支持时,这种消歧逻辑没有更新,所以Clang认为

Foo f3 { [vec{

...必须是数组指示符(因为{不能出现在C ++ 11 lambda的捕获列表中。)

我在Clang SVN r206128修复此问题,修复程序将在Clang 3.5中修复。与此同时,您可以使用括号解决此问题:

Foo f3 { ([vec{std::move(vec)}] () {}) };