|
Boost : |
Subject: Re: [boost] Move semantics for std::string?
From: Giovanni Piero Deretta (gpderetta_at_[hidden])
Date: 2012-02-17 11:47:12
On Thu, Feb 16, 2012 at 11:30 PM, Jeffrey Lee Hellrung, Jr.
<jeffrey.hellrung_at_[hidden]> wrote:
> On Thu, Feb 16, 2012 at 3:06 PM, Robert Dailey <rcdailey_at_[hidden]> wrote:
>> On Thu, Feb 16, 2012 at 5:01 PM, Jeffrey Lee Hellrung, Jr. <
>> jeffrey.hellrung_at_[hidden]> wrote:
>> >
>> > Well I think you can always make NRVO apply if you're always returning
>> the
>> > same variable, which is always possible: just swap what you would
>> otherwise
>> > return into that common variable.
>> >
>> > In general, though, no, I don't think you can cleanly introduce
>> (emulated)
>> > move semantics non-intrusively in C++03.
>>
>>
>> Just to be clear, what "common variable" are you referring to?
>>
>> Thanks for your answers.
>>
>
> std::string foo()
> {
> std::string result;
> /*...*/
> // would like to "return x;", but instead...
> result.swap(x);
> return result;
> /*...*/
> // would like to "return y;", but instead...
> result.swap(y);
> return result;
> }
>
I think this is the simplest "move emulation" in C++03, which simply
encapsulates the pattern above:
template<class Swappable>
Swappable move(Swappable& x) {
Swappable result; // Also requires DefaultConstructible
using std::swap;
swap(x, result);
return result; // NRVO
}
Usage:
std::string foo()
{
std::string result;
/*...*/
// would like to "return x;", but instead...
return move(x);
/*...*/
// would like to "return y;", but instead...
return move(y);
}
Note that it is sematically different from std::move as it will always
modify the argument, while std::move is similar to a cast to rvalue
reference.
HTH,
-- gpd
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk