When should I use std::move, and when should I let the compiler optimize?

For example:

using SerialBuffer = vector<unsigned char>;

// Let the compiler optimize it
SerialBuffer read(size_t size) const
{
    SerialBuffer buffer(size);
    read(begin(buffer), end(buffer));
    // Return Value Optimization
    return buffer;
}

// Explicit move
SerialBuffer read(size_t size) const
{
    SerialBuffer buffer(size);
    read(begin(buffer), end(buffer));
    return move(buffer);
}

Which should I use?

Edit
Report