构造函数主体中的 lambda 中使用的非常量本地成员的“只读变量增量”错误

Bak*_*ish 4 c++ lambda

我正在尝试创建一个类,其中在构造函数的主体中,本地成员变量被初始化并在 lambda 中重用,该 lambda 也直接在构造函数的主体中初始化。一个非常简单的版本如下所示:

\n
#include <iostream>\n\nclass TestClass {\n    public:\n    TestClass()\n    {\n        auto localMember = 0;\n        const auto incrementAndDisplay = [localMember] {\n            localMember++;\n            std::cout << "Member value is now increased to: " << localMember << std::endl;\n        };\n\n        incrementAndDisplay();\n    }\n};\n\nint main()\n{\n    TestClass testClass;\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,这段代码无法编译。对于修改本地成员的行,GCC 会抛出以下错误消息:

\n
main.cpp:9:13: error: increment of read-only variable \xe2\x80\x98localMember\xe2\x80\x99\n    9 |             localMember++;\n      |             ^~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

我对这个错误消息感到困惑,因为我从未将此变量标记为const并且可以在 lambda 之外修改它而不会出现任何问题。但是,如果我声明localMember为类成员,代码将编译没有任何问题。
\n此时我最好的猜测是 lambda 似乎无法“正确”访问成员,因为它只是一个临时值,稍后可能会被丢弃。然而,我的看法可能完全错误。
\n问题是:有没有办法在 lambda 中使用该变量,而不使其成为类成员?如果这是不可能的,为什么不呢?

\n

Ted*_*gmo 6

您正在按值捕获构造函数的局部变量。

Lambda 是隐式不可变的,捕获的localMember是 Lambda 的成员变量(您甚至已指定为const)。为了使其可变,您需要删除const并添加mutable

/*const*/ auto incrementAndDisplay = [localMember]() mutable {
  ^^^^^                               ^^^^^^^^^^^ ^^^^^^^^^^
  remove                                   |          add
                                           |
                  copy of the variable defined in the surrounding function
Run Code Online (Sandbox Code Playgroud)

如果您确实想增加在 lambda之外localMember定义的变量的值,则需要通过引用捕获它:

auto incrementAndDisplay = [&localMember] {
//                          ^
//                  capture by reference
Run Code Online (Sandbox Code Playgroud)