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

陈柏霖

为什么这段代码无法编译?我正在使用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
}

错误信息和标志

理查德·史密斯

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

C99的指定初始化程序包括以下语法:

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

铛支持它们在C ++以及C中的扩展名,它看到因此当[{ ... },需要弄清楚是否这是一个开始λ-表达或阵列标志(或属性说明符在目的,或C ++ 11,消息发送表达式)。

不幸的是,当Clang获得对C ++ 1y的init- capture的支持时,这种歧义逻辑并未得到更新,因此Clang认为

Foo f3 { [vec{

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章