X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FMoveWrapper.h;h=853f50ef4255700b20ecc51b779728f7162e1e66;hb=99a7f38378ae291d89e12e66dca7866485fb45b6;hp=7300f9a8a7c6c34126e0197f4622af782cfde582;hpb=275ca94d04e44f28cfa411668eb1c1dd8db90b80;p=folly.git diff --git a/folly/MoveWrapper.h b/folly/MoveWrapper.h index 7300f9a8..853f50ef 100644 --- a/folly/MoveWrapper.h +++ b/folly/MoveWrapper.h @@ -54,6 +54,9 @@ class MoveWrapper { const T* operator->() const { return &value; } T* operator->() { return &value; } + /// move the value out (sugar for std::move(*moveWrapper)) + T&& move() { return std::move(value); } + // If you want these you're probably doing it wrong, though they'd be // easy enough to implement MoveWrapper& operator=(MoveWrapper const&) = delete; @@ -63,9 +66,12 @@ class MoveWrapper { mutable T value; }; -template -MoveWrapper makeMoveWrapper(T&& t) { - return MoveWrapper(std::forward(t)); +/// Make a MoveWrapper from the argument. Because the name "makeMoveWrapper" +/// is already quite transparent in its intent, this will work for lvalues as +/// if you had wrapped them in std::move. +template ::type> +MoveWrapper makeMoveWrapper(T&& t) { + return MoveWrapper(std::forward(t)); } } // namespace