There's a terrific article about RVO and copy elision by Dave A at

http://cpp-next.com/

If I understand this correctly a decent compiler (say VS2008) will compile this
sequence

using namespace std;
typedef vector< string > V;
V get_names( );

V sorted(V names)
{
    sort(names);
    V ret;
    swap(ret, names);
    return ret;
}

V v = sorted( get_names( ) );

to generate zero copies - the final value of v will be the actual object generated by get_names().

Whereas this code sequence

using namespace std;
typedef vector< string > V;
V get_names( );

V sorted(V names)
{
    sort(names);
    V ret;
    swap(ret, names);
    return ret;
}

V tmp = get_names( );
V v = sorted( tmp );


Generates exactly one vector copy operation, at the call site of sorted().

Does that sound right?

- Rob.