From fc32070096058ebd74af2211dce3e1586558b849 Mon Sep 17 00:00:00 2001 From: Zachary Henkel Date: Thu, 21 Nov 2019 13:12:41 -0600 Subject: [PATCH] Address items called out in Issue 1418 (#1538) --- CppCoreGuidelines.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CppCoreGuidelines.md b/CppCoreGuidelines.md index 914a656..b5c2349 100644 --- a/CppCoreGuidelines.md +++ b/CppCoreGuidelines.md @@ -11981,7 +11981,8 @@ The language already knows the common cases where objects can be moved from, esp Never write `std::move()` just because you've heard "it's more efficient." In general, don't believe claims of "efficiency" without data (???). -In general, don't complicate your code without reason (??) +In general, don't complicate your code without reason (??). +Never write `std::move()` on a const object, it is silently transformed into a copy (see Item 23 in [Meyers15](#Meyers15)) ##### Example, bad @@ -12021,9 +12022,9 @@ The language already knows that a returned value is a temporary object that can * Flag use of `std::move(x)` where `x` is an rvalue or the language will already treat it as an rvalue, including `return std::move(local_variable);` and `std::move(f())` on a function that returns by value. * Flag functions taking an `S&&` parameter if there is no `const S&` overload to take care of lvalues. -* Flag a `std::move`s argument passed to a parameter, except when the parameter type is one of the following: an `X&&` rvalue reference; a `T&&` forwarding reference where `T` is a template parameter type; or by value and the type is move-only. +* Flag a `std::move`s argument passed to a parameter, except when the parameter type is an `X&&` rvalue reference or the type is move-only and the parameter is passed by value. * Flag when `std::move` is applied to a forwarding reference (`T&&` where `T` is a template parameter type). Use `std::forward` instead. -* Flag when `std::move` is applied to other than an rvalue reference. (More general case of the previous rule to cover the non-forwarding cases.) +* Flag when `std::move` is applied to other than an rvalue reference to non-const. (More general case of the previous rule to cover the non-forwarding cases.) * Flag when `std::forward` is applied to an rvalue reference (`X&&` where `X` is a concrete type). Use `std::move` instead. * Flag when `std::forward` is applied to other than a forwarding reference. (More general case of the previous rule to cover the non-moving cases.) * Flag when an object is potentially moved from and the next operation is a `const` operation; there should first be an intervening non-`const` operation, ideally assignment, to first reset the object's value.