Lambda static vs mutable variable
Posted: 22 May 2025, 22:21
Ich habe eine Lambda mit statischer Variable in der folgenden Antwort begegnet.
Meine Logik war, dass der statische man unerwartet zwischen verschiedenen Benutzern geteilt werden konnte. Wenn der Test beispielsweise parametrisiert wurde und die erste Instanziierung namens my_mock.foo () ungerade Anzahl der Male namens My_Mock.foo (), startet der zweite mit 26 anstelle von 13 . Ich denke
Ich habe diesen Code ausgeführt und sehe, dass er 0,1,2,3,0,1,0,1, bedeutet, dass meine anfängliche Intuition korrekt war, aber ich bin mir ehrlich gesagt immer noch nicht sicher, warum für den Sicht der Sprachanwalt.
Code: Select all
EXPECT_CALL(my_mock, foo(_))
.WillRepeatedly(InvokeWithoutArgs([](){
static int counter = 0;
constexpr static std::array values {13, 26};
return values[counter++ % values.size()];
}) );
< /code>
Meine erste Intuition bestand darin, die Antwort stattdessen mit einem veränderlichen Zähler zu kommentieren oder zu bearbeiten: < /p>
[counter = 0]() mutable { ... }
Code: Select all
#include
auto static_lambda() {
return []() { static int i = 0; return i++; }
}
auto mutable_lambda() {
return [i = 0]() mutable { return i++; }
}
int main() {
auto s = static_lambda();
std::printf("%d,", s());
std::printf("%d,", s());
auto s2 = static_lambda();
std::printf("%d,", s2());
std::printf("%d,", s2());
auto m = mutable_lambda();
std::printf("%d,", m());
std::printf("%d,", m());
auto m2 = mutable_lambda();
std::printf("%d,", m2());
std::printf("%d,", m2());
}