Rule A8-4-9 (required, design, automated)

”in-out” parameters declared as T & shall be modified.

Rationale

An ”in-out” parameter is declared with a type of reference to non-const. This means that a fully constructed object is passed into the function that can be read as well as modified. Note: Completely replacing the passed in object without reading any data from it would make it an ”out” parameter instead and is not considered compliant with this rule, also see rule: A8-4-8

Example

// $Id: A8-4-9.cpp 306178 2018-02-01 15:52:25Z christof.meerwald $

#include <cstdint>
#include <numeric>
#include <string>
#include <vector>

// Non-Compliant: does not modify the "in-out" parameter
int32_t Sum(std::vector<int32_t> &v)
{
    return std::accumulate(v.begin(), v.end(), 0);
}

// Compliant: Modifying "in-out" parameter
void AppendNewline(std::string &s)
{
    s += ’\n’;
}

// Non-Compliant: Replacing parameter value
void GetFileExtension(std::string &ext)
{
    ext = ".cpp";
}

See also

C++ Core Guidelines [11]: F.17: For ”in-out” parameters, pass by reference to non-const JSF December 2005 [8]: AV Rule 117.2: An object should be passed as T& if the function may change the value of the object.