From: Martin B. on
Zachary Turner wrote:
> On Dec 3, 2:36 am, Andrew <marlow.and...(a)googlemail.com> wrote:
>> On 2 Dec, 22:00, Zachary Turner <divisorthe...(a)gmail.com> wrote:
>>
>>> On Dec 2, 7:06 am, Andrew <marlow.and...(a)googlemail.com> wrote:
>>> Maybe I'm overlooking something, but I see little reason to return by
>>> value. What matters is whether you assign it to a const reference or
>>> to a value.
>> The view I am running into is that a function should return a const
>> ref to a string so that it can be assigned to a const ref to a string.
>> The argument is that doing this avoids string copying. I should have
>> made that clearer.
>>
>
> Right. If you return by value, it always makes a copy. If you return
> by const reference, it makes a copy when you want it to make a copy,
> and doesn't make a copy when you don't want it to make a copy.
>

It is not generally true that "If you return by value, it always makes a
copy." - the reason is RVO.
In the presence of RVO, Initializing a string object with
return-by-value is exactly the same as return-by-reference (Assigning is
not however), i.e.:

// e.g. with VC8 or later *without* optimizations

Foo f;
string s1("s1");
string s2("s2");

s1 = f.get_byval(); // Needs temporary!
s2 = f.get_byref(); // No need for temporary

string s3 = f.get_byval(); // Does NOT need temporary
string s4 = f.get_byval(); // Does NOT need temporary


br,
Martin

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]