Pasar de temporal usado en el encadenamiento de métodos.

Estoy tratando de hacer algo similar a esto:

#include  #include  struct Bar { Bar& doThings() {return *this;} std::unique_ptr m_content; // A non-copyable type }; struct Foo { Foo& append(Bar&& obj) { objects.push_back(std::move(obj)); return *this; } std::vector objects; }; int test() { Foo test; test.append(std::move(Bar{}.doThings())) //Ok // Not ok .append(Bar{}.doThings()) ; } 

error: no se puede enlazar la referencia rvalue de tipo Bar&& al lvalue de tipo Bar

¿Es posible hacer este trabajo sin el std :: move explícito?

Tratar de sobrecargar cosas no resuelve el problema:

error: Bar&& Bar::doThings() && no se puede sobrecargar

Puede agregar sobrecargas de referencia calificadas doThings() :

 struct Bar { Bar& doThings() & {return *this;} Bar&& doThings() && {return std::move(*this);} std::unique_ptr m_content; // A non-copyable type }; 

El problema es que cuando devuelve la instancia desde la función, no tiene un valor de r.

Sin embargo, hay una manera de sobrecargar las funciones basadas en el valor de rvalue / lvalue del objeto:

  Bar& doThings() & {return *this;} Bar doThings() && {return std::move(*this); }