gpt4 book ai didi

c++ - 从 lambda 捕获中捕获变量会出错?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:05 25 4
gpt4 key购买 nike

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 ) );
});
});
}

给出错误

error C3480: '`anonymous-namespace'::::moves': a lambda capture variable must be from an enclosing function scope

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

更改代码以分配移动到临时并捕获临时解决错误。这在 VS2010 中没有错误:

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 ) );
});
});
}

问题是为什么?

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

最佳答案

这是 a known bug这似乎已被修复,尽管对于 VS11 Beta 来说为时已晚,因为该错误仍然存​​在。

另一个简单的解决方法是隐式捕获内部 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 ) );
});
});
}

恕我直言,您通常应该通过引用隐含地捕获您的内容,因为我在这里看不出有任何理由不这样做。

顺便说一句,多亏了你我发现了another bug ,这可能是相关的。如果可以,请点赞。

关于c++ - 从 lambda 捕获中捕获变量会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9647764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com