Our website uses cookies to enhance your browsing experience.
Accept
to the top
>
>
>
V2674. MISRA. The argument to...
menu mobile close menu
Additional information
toggle menu Contents

V2674. MISRA. The argument to 'std::move' should be a non-const lvalue.

Jul 30 2026

This diagnostic rule is based on the MISRA (Motor Industry Software Reliability Association) software development guidelines.

This diagnostic rule is relevant only for C++.

Applying std::move to an object of the const T type produces a value of the const T&& type. Under ideal passing conditions, this type will not invoke a constructor or move operator, since their signatures require the T&& mutable rvalue reference. According to the overload resolution rules, the compiler selects the copy constructor (if one is available). As a result, the object is copied rather than moved, which leads to an unintended copy of its resources.

The example:

void archiveData()
{
  std::vector<std::string> archive;
  const std::string technicalId = ....;
  // ....
  archive.push_back(std::move(technicalId));
}

The technicalId variable is marked with the const qualifier, meaning that the result of std::move(technicalId) will have the const std::string&& type. So, when resolving the overload for std::vector<std::string>::push_back, the version that takes const std::string & and results in a copy of the string will be selected.

The fix may look like this:

Option N1. If omitting the constness of the object being moved is not possible, the call to std::move needs to be removed:

void archiveData()
{
  std::vector<std::string> archive;
  const std::string technicalId = ....;
  // ....
  archive.push_back(technicalId);
}

Option N2. The object constness can be omitted:

void archiveData()
{
  std::vector<std::string> archive;
  std::string technicalId = ....;
  // ....
  archive.push_back(std::move(technicalId));
}

Removing the const qualifier changes the resulting expression type to std::string &&. This enables the compiler to successfully select the std::vector<std::string>::push_back overload that takes std::string &&, which then takes the resources from the passed object.

What a quick draw in the Wild West of Coding —
you caught the bug in sec!
But we catch them in milliseconds. How about a duel?

Try free