Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从lambda捕获中捕获变量会出现错误吗?_C++_Lambda - Fatal编程技术网

C++ 从lambda捕获中捕获变量会出现错误吗?

C++ 从lambda捕获中捕获变量会出现错误吗?,c++,lambda,C++,Lambda,VS2010中的以下代码: void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid ) { ForEachBit( mask, [&moves,occupied,valid]( Square from ) { auto toMask = BishopAttacks( from, occupied ) & valid;

VS2010中的以下代码:

void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid )
{
  ForEachBit( mask, [&moves,occupied,valid]( Square from )
  {
    auto toMask = BishopAttacks( from, occupied ) & valid;
    ForEachBit( toMask, [&moves, from]( Square to )
    {
      moves.push_back( Move( from, to ) );
    });
  });
}
void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid )
{
  ForEachBit( mask, [&moves,occupied,valid]( Square from )
  {
    auto& x = moves;
    auto toMask = BishopAttacks( from, occupied ) & valid;
    ForEachBit( toMask, [&x, from]( Square to )
    {
      x.push_back( Move( from, to ) );
    });
  });
}
void AddBishopMoves(向量和移动、uint64屏蔽、uint64占用、uint64有效)
{
前置位(掩码,[&移动,占用,有效](平方自)
{
auto-toMask=主教攻击(从,占用)&有效;
前置位(toMask,[&移动,从](平方到)
{
移动。推回(移动(从,到));
});
});
}
给出了错误

错误C3480:“‘匿名命名空间’::移动”:lambda 捕获变量必须来自封闭函数作用域

但我确实在外lambda中通过引用捕获了“移动”

更改代码以将移动分配给临时对象并捕获临时对象可以解决此错误。这在VS2010中不会出现错误:

void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid )
{
  ForEachBit( mask, [&moves,occupied,valid]( Square from )
  {
    auto toMask = BishopAttacks( from, occupied ) & valid;
    ForEachBit( toMask, [&moves, from]( Square to )
    {
      moves.push_back( Move( from, to ) );
    });
  });
}
void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid )
{
  ForEachBit( mask, [&moves,occupied,valid]( Square from )
  {
    auto& x = moves;
    auto toMask = BishopAttacks( from, occupied ) & valid;
    ForEachBit( toMask, [&x, from]( Square to )
    {
      x.push_back( Move( from, to ) );
    });
  });
}
void AddBishopMoves(向量和移动、uint64屏蔽、uint64占用、uint64有效)
{
前置位(掩码,[&移动,占用,有效](平方自)
{
自动&x=移动;
auto-toMask=主教攻击(从,占用)&有效;
ForEachBit(toMask,[&x,from](平方到)
{
x、 推回(从,到);
});
});
}
问题是为什么

我是否在避免编译器试图警告我的逻辑中的一些微妙错误? c++11捕获语义不支持这一点吗? 或者这只是一个有缺陷的功能?

这似乎已经被修复,尽管对于VS11测试版来说已经太晚了,因为缺陷仍然存在

另一个简单的解决方法是隐式捕获内部lambda中的变量:

void AddBishopMoves( vector<Move> &moves, uint64_t mask, uint64_t occupied, uint64_t valid )
{
  ForEachBit( mask, [&moves,occupied,valid]( Square from )
  {
    auto toMask = BishopAttacks( from, occupied ) & valid;
    ForEachBit( toMask, [&, from]( Square to ) // <== implicit capture of 'moves'
    {
      moves.push_back( Move( from, to ) );
    });
  });
}
void AddBishopMoves(向量和移动、uint64屏蔽、uint64占用、uint64有效)
{
前置位(掩码,[&移动,占用,有效](平方自)
{
auto-toMask=主教攻击(从,占用)&有效;

ForEachBit(toMask,[&,from](平方到)//看起来像是一个编译器错误。而且,无论如何,MSVS10是不可信的。它在发布的那天就坏了。@Nawaz:我认为这有点苛刻。MSVS10不是完美的,但在大多数情况下它都很好。而且我还没有使用过没有错误的编译器。@BenjaminLindley:可能。但是与今天使用的所有其他主要编译器相比,MSVS10有更多的错误。因此,如果编译器有更多的错误,那么它就不那么容易被信任。