Первый вариант выглядит логичным, хотя я бы сказал по буквам std::forward<Bar>(other)
.
Понятия не имею, что заставляет CBuilder думать, что тип &other
равен Bar&&
, а не Bar*
.
По сути, здесь происходит то, что, как только ссылка на rvalue названа, она больше не является ссылкой на rvalue, для этого и используется std::forward
, она поддерживает rvaluness (для добавления фразы), поэтому, когда вы вызываете : Foo(other)
, вы Вы вызываете конструктор копирования, а не конструктор перемещения.
Это должен быть идиоматический (и совместимый со стандартами) способ добиться того, что вы пытаетесь сделать (если только я не неправильно понимаю FCD).