Чтобы вернуть std:: move (x) или нет?

являются

std::vector<double> foo ()
{
    std::vector<double> t;
    ...

    return t;
}

и

std::vector<double> foo ()
{
    std::vector<double> t;
    ...

    return std::move (t);
}

эквивалент?

Точнее, return x всегда эквивалентно return std::move (x)?

Ответ 1

Они не эквивалентны, и вы всегда должны использовать return t;.

Более длинная версия заключается в том, что если и только если оператор возврата имеет право на оптимизацию возвращаемого значения, то репатриант связывается с ссылкой rvalue (или в обычном порядке, "move неявно" ).

Из-за написания return std::move(t);, вы фактически блокируете оптимизацию возвращаемого значения!