Как избежать перемещения при передаче временного значения по значению?

В следующем коде:

Widget makeWidget()
{
    return Widget();
}

void foo(Widget widget)
{
   ...
}

foo(makeWidget());

объект Widget всегда будет создаваться на месте (внутри функции foo), поэтому не происходит построения перемещения (по крайней мере, со всеми компиляторами, которые я пробовал). Каковы простые примеры передачи временного объекта в функцию по значению таким образом, чтобы построение перемещения действительно имело место (без явного перемещения, т.е. с использованием std::move)?


person rubix_addict    schedule 08.04.2015    source источник
comment
Мне любопытно, почему вы хотите избежать движения?   -  person Borgleader    schedule 08.04.2015
comment
Я просто хочу лучше понять С++.   -  person rubix_addict    schedule 08.04.2015
comment
Вы ищете флаги gcc -fno-elide-constructors?   -  person Jarod42    schedule 08.04.2015


Ответы (2)


Критерием исключения в этом случае является:

когда временный объект класса, который не был привязан к ссылке, будет скопирован/перемещен в объект класса с тем же типом cv-unqualified

Таким образом, простой способ предотвратить элизию — привязать его к ссылке:

foo(std::move(makeWidget());
person Mike Seymour    schedule 08.04.2015
comment
У меня были неявные ходы, поэтому никакого std::move. Я отредактировал свой исходный вопрос. Извините, что недостаточно конкретно. - person rubix_addict; 08.04.2015
comment
@rubix_addict: В таком случае я понятия не имею, о чем вы спрашиваете. Если вы передаете временное значение по значению функции с тем же типом параметра, то перемещение можно пропустить. Нет примеров, чтобы это не было исключено. - person Mike Seymour; 08.04.2015

Gcc имеет флаг -fno-elide-constructors, который отключает копировать элизию. С этой опцией оба шага будут выполнены в вашем примере кода.

person eerorika    schedule 08.04.2015