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

标签 c++ c++14

为什么这段代码编译失败?我在 -std=c++1y

中使用 clang 3.4
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

最佳答案

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

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

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

Clang 支持它们作为 C++ 和 C 中的扩展,因此当它在 { ... } 中看到 [ 时,它需要弄清楚无论是 lambda 表达式 还是数组指示符(或属性说明符,或者在 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)}] () {}) };

关于c++ - 统一初始化中的广义 lambda 捕获无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22858648/

相关文章:

c++ - 如何在 Rust 中静态链接 node.js?

c++ - 主 Makefile 中 undefined reference

c++ - 创建和管理查找容器的正确方法

非 const 指针成员上的 C++ const 方法

c++ - 我可以在 C++ 中创建 "attributed"类型吗?

c++ - 在 C++11 中使用 max<int> 作为谓词中断

c++ - 数组-遍历辅助数组

C++ std::stoul 不抛出异常

c++ - 间接堆分配中的堆栈或堆

c++ - 在 c++14 lambda 表达式中捕获和移动 unique_ptr