In the old days, if I wanted a string representation of an object A
, I would write something with the signature void to_string(const A& a, string& out)
to avoid extra copies. Is this still the best practice in C++11, with move semantics and all?
I have read several comments on other contexts that suggest relying on RVO and instead writing string to_string(const A& a)
. But RVO is not guaranteed to happen! So, how can I, as the programmer of to_string, guarantee the string is not copied around unnecessarily (independently of the compiler)?
Here is the answer I gathered from feedback and other resources:
The straightforward return by value is the idiom because:
However, if the typical usage is anticipated to be something like
std::string s;
while (i_need_to)
{
to_string(get_A(), s);
process(s);
update(i_need_to);
}
and if the type in question has a default constructor*, then it may still make sense to pass the object that should hold the return by reference.
*considering string here only as an example, but the question and answers could be generalized