为什么这段代码无法编译?我正在使用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] 删除。
我来说两句