Fix passing MoveWrapper into lambdas
authorAlex Landau <alandau@fb.com>
Tue, 29 Oct 2013 21:06:18 +0000 (14:06 -0700)
committerSara Golemon <sgolemon@fb.com>
Wed, 6 Nov 2013 01:35:18 +0000 (17:35 -0800)
Summary:
GCC can't compile code that passes a MoveWrapper into a lambda
in some cases. For example if the capture list has
[someConstObject, myMoveWrapper], gcc 4.7 fails. This specific case
works with gcc 4.8, but other cases (e.g. [this, myMoveWrapper]) still
fail.

This diff is a hack that makes code like that compile. It can be
removed, along with MoveWrapper itself once we move to C++14 with its
extended lambda syntax.

Test Plan: fbmake

Reviewed By: hans@fb.com

FB internal diff: D1032585

folly/MoveWrapper.h

index bbdca228ea1bca64af0d6b1262bc8c9191c8ef30..481af48979886ccb7655c6e0f74a1924b05bdc0d 100644 (file)
@@ -43,7 +43,7 @@ class MoveWrapper {
   MoveWrapper(T&& t) : value(std::move(t)) {}
 
   /// copy is move
-  MoveWrapper(MoveWrapper& other) : value(std::move(other.value)) {}
+  MoveWrapper(const MoveWrapper& other) : value(std::move(other.value)) {}
 
   /// move is also move
   MoveWrapper(MoveWrapper&& other) : value(std::move(other.value)) {}
@@ -60,7 +60,7 @@ class MoveWrapper {
   MoveWrapper& operator=(MoveWrapper&&) = delete;
 
  private:
-  T value;
+  mutable T value;
 };
 
 template <class T>