From: Kefu Chai Date: Thu, 29 Oct 2020 08:24:45 +0000 (+0800) Subject: crimson/os: capture local bindings using capture variable list X-Git-Tag: v16.1.0~735^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F37890%2Fhead;p=ceph.git crimson/os: capture local bindings using capture variable list structured binding does not define variables, and the implicit capture-by-copy `=` does not help in this case, we have to define a capture with an initializer to create a *variable* enclosed by the closure explicitly. this address the error like: src/crimson/os/seastore/segment_cleaner.cc:315:5: error: reference to local binding 'addr' declared in enclosing lambda expression addr); ^ Signed-off-by: Kefu Chai --- diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 21e669f56143..a3ed047d7d47 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -308,7 +308,7 @@ SegmentCleaner::do_gc_ret SegmentCleaner::do_gc( addr, info.addr, info.len - ).safe_then([=, &t](CachedExtentRef ext) { + ).safe_then([addr=addr, &t, this](CachedExtentRef ext) { if (!ext) { logger().debug( "SegmentCleaner::do_gc: addr {} dead, skipping", @@ -324,7 +324,7 @@ SegmentCleaner::do_gc_ret SegmentCleaner::do_gc( t, ext); }); - }).safe_then([=, &t] { + }).safe_then([next=next, &t, this] { auto old_pos = std::exchange(gc_current_pos, next); if (gc_current_pos == P_ADDR_NULL) { t.mark_segment_to_release(old_pos.segment);