c++ - 为什么 C++1 1's lambda require "mutable"关键字默认用于按值捕获?

标签 c++ lambda c++11

简短示例:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}

问题:为什么我们需要 mutable 关键字?它与传递给命名函数的传统参数有很大不同。背后的原理是什么?

我的印象是按值捕获的全部意义在于允许用户更改临时值——否则我几乎总是最好使用按引用捕获,不是吗?

有什么启示吗?

(顺便说一句,我正在使用 MSVC2010。据我所知,这应该是标准的)

最佳答案

它需要 mutable 因为默认情况下,函数对象在每次调用时都应该产生相同的结果。这就是面向对象函数和使用全局变量的函数之间的区别。

关于c++ - 为什么 C++1 1's lambda require "mutable"关键字默认用于按值捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505953/

相关文章:

c++ - 用迭代器修改容器的内容

c# - c# linq lambda 使用多列加入三个列表

scala - 使用 Lambda 表达式的复杂 Scala 类型推断

c++ - 为什么 "true;"(和其他)是有效的 C++ 代码行?

c++ - 为什么 const_cast(或 static_cast)不添加 const?

c++ - 是什么导致 std::bad_function_call?

c++ - 用于 g++ 编译的 C++ 文件的用户定义扩展

c++ - 为什么 max (max(a,b), c) 是错误的

c++ - 试图在映射 C++ 中存储指向抽象类的指针

c++ - 如何使用 mac 的默认 midi 音序器作为 midi 输出?