1.. title:: clang-tidy - cppcoreguidelines-rvalue-reference-param-not-moved
2
3cppcoreguidelines-rvalue-reference-param-not-moved
4==================================================
5
6Warns when an rvalue reference function parameter is never moved within
7the function body.
8
9Rvalue reference parameters indicate a parameter that should be moved with
10``std::move`` from within the function body. Any such parameter that is
11never moved is confusing and potentially indicative of a buggy program.
12
13Example:
14
15.. code-block:: c++
16
17  void logic(std::string&& Input) {
18    std::string Copy(Input); // Oops - forgot to std::move
19  }
20
21Note that parameters that are unused and marked as such will not be diagnosed.
22
23Example:
24
25.. code-block:: c++
26
27  void conditional_use([[maybe_unused]] std::string&& Input) {
28    // No diagnostic here since Input is unused and marked as such
29  }
30
31Options
32-------
33
34.. option:: AllowPartialMove
35
36   If set to `true`, the check accepts ``std::move`` calls containing any
37   subexpression containing the parameter. CppCoreGuideline F.18 officially
38   mandates that the parameter itself must be moved. Default is `false`.
39
40  .. code-block:: c++
41
42    // 'p' is flagged by this check if and only if AllowPartialMove is false
43    void move_members_of(pair<Obj, Obj>&& p) {
44      pair<Obj, Obj> other;
45      other.first = std::move(p.first);
46      other.second = std::move(p.second);
47    }
48
49    // 'p' is never flagged by this check
50    void move_whole_pair(pair<Obj, Obj>&& p) {
51      pair<Obj, Obj> other = std::move(p);
52    }
53
54.. option:: IgnoreUnnamedParams
55
56   If set to `true`, the check ignores unnamed rvalue reference parameters.
57   Default is `false`.
58
59.. option:: IgnoreNonDeducedTemplateTypes
60
61   If set to `true`, the check ignores non-deduced template type rvalue
62   reference parameters. Default is `false`.
63
64  .. code-block:: c++
65
66    template <class T>
67    struct SomeClass {
68      // Below, 'T' is not deduced and 'T&&' is an rvalue reference type.
69      // This will be flagged if and only if IgnoreNonDeducedTemplateTypes is
70      // false. One suggested fix would be to specialize the class for 'T' and
71      // 'T&' separately (e.g., see std::future), or allow only one of 'T' or
72      // 'T&' instantiations of SomeClass (e.g., see std::optional).
73      SomeClass(T&& t) { }
74    };
75
76    // Never flagged, since 'T' is a forwarding reference in a deduced context
77    template <class T>
78    void forwarding_ref(T&& t) {
79      T other = std::forward<T>(t);
80    }
81
82This check implements `F.18
83<http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#f18-for-will-move-from-parameters-pass-by-x-and-stdmove-the-parameter>`_
84from the C++ Core Guidelines.
85
86