I don't know much about the function, except it takes a const std::string&, and I want to call this function from inside a class, and the string input I'm sending in is returned from an instance function on this class.
Is std::move() usage here always safe and more performant, given what we know?
//In some header file:
void some_func_I_only_know_its_signature(const std::string& string_input);
public MyClass{
public:
void myFunc(){
some_func_I_only_know_its_signature(std::move(getMyString()));
}
private:
std::string getMyString(){
return myString;
}
std::string myString_;
};
CodePudding user response:
std::move actually does absolutely nothing here:
some_func_I_only_know_its_signature(std::move(getMyString()));
The return value of getMyString is already an rvlaue. The thing is std::move actually doesn't move anything. This is a common misconception. All it does is cast an lvalue to an rvalue. If the value is an rvalue and has a move constructor (sdt::string does) it will get moved. But in this case, since the function does not expect an rvalue reference either way you are just going to pass a reference to the return value of getMyString() So you can just:
some_func_I_only_know_its_signature(getMyString());
That being said the most performant ways is to just:
some_func_I_only_know_its_signature(myString_);
The function expects a const& which means it only wants read access. Your getMyString() function creates a copy of myString_ and returns it. You don't have to create a copy here, you can just pass a reference to your string directly. get/set functions are usually used for controlled public access to a private field from outside the class.
