Lambda 捕获和可修改的捕获值
在 C 0x 中,lambda 表达式提供了捕获局部变量的强大方法。但是,默认情况下,通过值捕获的变量被视为 const。在使用需要修改捕获值的库时,这可能会造成限制。
考虑以下场景:
<code class="cpp">struct foo { bool operator() (const bool &a) { return a; } }; int main() { foo afoo; // Attempt to capture non-const reference by value auto bar = [=]() -> bool { afoo(true); }; }</code>
由于尝试修改捕获的值 afoo,此代码无法编译在非常量成员函数 afoo::operator().
解决方案:使用 Mutable Lambda
按值捕获,同时保留修改捕获变量的能力,可以使用 mutable 关键字。通过将 lambda 声明为可变,它允许修改其内部状态,包括捕获的值。
<code class="cpp">auto bar = [=]() mutable -> bool { afoo(true); };</code>
在这个修改后的示例中,允许 lambda 的 operator() 修改捕获的 afoo,从而解决了编译问题错误。请注意,如果没有 mutable 关键字,由于捕获的非 const 值,lambda 将被视为 const。
以上是Lambda 函数可以捕获 C 0x 中的非常量值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!