为什么这段代码无法编译?我正在使用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
}
答案 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)}] () {}) };