Почему бы не использовать std::переместить все?

#c #c 11

Вопрос:

я не совсем понимаю этот ответ. Почему мы все не используем тип с std::move?

Пример;

 std::map<int, int> try;

void foo(std::map<int, int>amp; try, int t1, int t2)
{
    try.emplace(std::move(t1), std::move(t2));
}

int main()
{
    int k = 1;
    int v = 5;

    try.emplace(k , v); // emplace copies
    foo(try, k, v); // emplace referance
    return 0;
}
 

так в чем же заключаются различия между копиями и ссылками на место? Я знаю, что std::перемещение более эффективно, чем использование копий. (если я ошибаюсь, извините. Я новичок) Так что я могу использовать? Использование копий или std::перемещение? Извините за мой плохой английский.

Комментарии:

1. Обратите внимание, что вы не можете использовать try в качестве имени переменной — это зарезервированное слово.

2. У An int нет управляемых ресурсов для перемещения, поэтому перемещение an int в точности совпадает с копированием an int .

3. @Eljay спасибо за ваш ответ!

4. Потому что даже с int учетом значения может измениться — жить — godbolt.org/z/xrW419cPr и тогда у вас больше не будет этой ценности.

Ответ №1:

Причина того, что объект не всегда перемещается, заключается в том, что после перемещения объекта у вас его больше нет.

 void f()
{
    Object o;
    o.stuff();
    SomeFunctionTakingAReference(o);
    o.stuff(); // your o object is still usable
    SomeFunctionTakingAReference(std::move(o));
    // Here your o object is not valid anymore. It's gone and you have a valid but different object
 

Комментарии:

1. Я бы не сказал «больше не действует», это слишком двусмысленно. Объект существует и может быть использован, но его значение исчезло (перенесено в другой объект того же типа).