Whenever possible, allow the compiler to do your copies for you. After all, it may know something you don’t:
bool search_for_token(std::string& str); //Tokens must be uppercase bool check(const std::string& str) { string upper(str); makeUppercaseInplace(upper); return search_for_token(upper); }
Even though the general best practice for passing non-changing objects is by reference to const, if you need to make a copy anyway, let the compiler do the job:
bool check(std::string str) { makeUppercaseInplace(str); return do_check(str); }
What is the difference? It looks like when check()
is called, a copy is made no matter if you or the compiler does it. The difference is, when you allow the compiler to do the job, you also alow it to skip the copy if it is not strictly needed. If the compiler detects that the string you are calling check
with can never be used again, it can skip the copy and give that string directly to makeUpperCaseInplace()
. Example:
std::string generateString(); check(generateString());
In this situation, the compiler knows that the return value from generateString()
can never be used by anyone else[1], and can reuse that object when calling check()
.