2015-04-08 4 views
1

В следующем коде:Как избежать перемещения при выполнении временного значения?

Widget makeWidget() 
{ 
    return Widget(); 
} 

void foo(Widget widget) 
{ 
    ... 
} 

foo(makeWidget()); 

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

+3

Мне любопытно, почему вы хотите избежать движения ellision? – Borgleader

+0

Я просто хочу лучше понять C++. –

+0

Вы ищете gcc-флаги '-fno-elide-constructors'? – Jarod42

ответ

3

Критерий элизии в данном случае:

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

Так простой способ предотвратить Пропуска бы привязать его к ссылке:

foo(std::move(makeWidget()); 
+0

У меня были неявные движения на уме, поэтому std :: move. Я редактировал свой оригинальный вопрос. Извините за то, что вы недостаточно. –

+0

@rubix_addict: В таком случае я понятия не имею, о чем вы спрашиваете. Если вы передаете временную по значению функцию с тем же типом параметра, то переход может быть отменен. Нет никаких примеров того, что это не исключено. –

+0

@mike 'T && as_rvalue (T &)' ясно;) – Yakk

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^