c++ boost c++11 move-semantics boost-optional

c++ - ¿Es posible mover un impulso:: opcional?



boost c++11 (3)

Boost.Optional admite la construcción de movimientos solo desde la versión 1.56 de Boost. Ver las notas de la versión .

He estado tratando de definir un constructor de movimiento predeterminado en una clase con una variable de miembro boost::optional .

#include <boost/optional.hpp> #include <utility> #include <vector> struct bar {std::vector<int> vec;}; struct foo { foo() = default; foo(foo&&) = default; boost::optional<bar> hello; }; int main() { foo a; foo b(std::move(a)); }

Mi compilador admite la semántica de movimientos y los constructores de movimientos predeterminados, pero no puedo hacer que esto funcione.

% clang++ foo.cc -std=c++11 -stdlib=libc++ foo.cc:15:7: error: call to deleted constructor of ''foo'' foo b(std::move(a)); ^ ~~~~~~~~~~~~ foo.cc:9:3: note: function has been explicitly marked deleted here foo(foo&&) = default; ^ 1 error generated.

¿Hay alguna manera de mover un boost::optional sin modificar el código fuente de Boost? ¿O debería esperar hasta que Boost apoye el movimiento?

Tuve el mismo problema con boost::any en el pasado.


En cuanto a boost::optional código fuente boost::optional , no define constructores de movimiento o asignaciones de movimiento. Sin embargo, sí define el constructor y la asignación de copia, que impiden que el compilador genere de forma automática el constructor de movimientos y la asignación para él.

Ver Move constructor - Preguntas y respuestas :

el compilador generará implícitamente el constructor de movimientos como movimientos de miembros, a menos que haya definido explícitamente un constructor de copia o una asignación de copia / movimiento o un destructor

Como Luc Danton sugiere que debe haber una cura para eso. Tratemos de usar swap para mover boost::optional con la esperanza de que crear un boost::optional vacío boost::optional sea ​​barato y luego simplemente intercambiemos boost::optional -default por el valor r-value foo , por ejemplo:

foo(foo&& b) { hello.swap(b.hello); }

Y lo mismo para la asignación de movimiento.


No está claro qué tan alto en la agenda C ++ 11 ofrece soporte para boost :: optional is.

Encontré un buen tipo en Internet que me dio algunos de sus propios códigos bajo una licencia de impulso ... que todavía está experimentando algunos ajustes. Está en un punto donde funciona para mí. Quizás ayude a cualquiera que esté viendo esta pregunta:

https://github.com/hostilefork/CopyMoveConstrainedOptional

También hay un esfuerzo grupal más grande para definir un std::optional que ha estado sucediendo ... pero su implementación de referencia no fue capaz de manejar algunos de los casos que tuve:

http://kojot.sggw.waw.pl/~akrzemi1/optional/tr2.optional.proposal.html