pNewLayer_p is a reference to rvalue, but it is not rvalue itself - mainly because it has a name. In the standard, the values ββof R are defined as follows:
(3.10 / 1) An Rvalue (so-called, historically, because rvalues ββcan appear on the right side of an assignment expression) is an xvalue, a temporary object (12.2), or a subobject or value that is not associated with the object.
In other words, rvalues ββare literals, temporary and other unidentified objects (such as xvalues, that is, values ββthat have just been returned by a function but not yet assigned).
The rvalue pNewLayer_p in your code is a named object, so it is itself an lvalue. Applying std::move to it, which formally is a function, turns it (formally) into something returned by the function, that is, the value of x, which is the r-value that you can pass to the push_back engine version. There is std::move .
(Note: The above assumes that shared_Layer_ptr is a type, not a template parameter. If it is a template parameter, shared_Layer_ptr && will be the so-called universal reference, that is, it can be a reference to lvalue or rvalue depending on how the template is instantiated. In this case std::forward would be a suitable function to use instead of std::move .)
source share