Можно ли переместить повышение :: необязательно?

Я пытался определить конструктор перемещения по умолчанию в классе с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));
}

Мой компилятор поддерживает как семантику перемещения, так и конструкторы перемещения по умолчанию, но я не могу заставить это работать.

% 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.

Есть ли способ переместитьboost::optional without изменить исходный код Boost? Или я должен ждать, пока Boost не поддержит движение?

У меня была такая же проблема сboost::any в прошлом.

Ответы на вопрос(3)

Решение Вопроса

Смотря наboost::optional Исходный код не определяет конструкторы перемещения или назначения перемещений. Однако он определяет конструктор копирования и присваивание, которые не позволяют компилятору автоматически генерировать конструктор перемещения и присваивание для него.

УвидетьПереместить конструктор & # x2014; Q & усилителя, A:

the compiler will implicitly generate move constructor as member-wise moves, unless you have explicitly defined a copy constructor or copy/move assignment or a destructor

Как полагает Люк Дантон, для этого нужно лекарство. Давайте попробуем использоватьswap двигатьсяboost::optional в надежде на создание пустогоboost::optional дешево, а потом мы просто поменять построенный по умолчаниюboost::optional с одним из р-значенияfooНапример:

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

И то же самое для назначения движения.

Boost.Optional поддерживает построение перемещения только начиная с версии Boost 1.56. Увидетьпримечания к выпуску.

Непонятно, насколько важна поддержка C ++ 11 для boost :: option.

В Интернете я нашел хорошего человека, который дал мне немного своего собственного кода под лицензией повышения, которая все еще подвергается некоторым изменениям. Это в тот момент, когда это работает для меня. Может быть, это поможет любому, кто посмотрит на этот вопрос:

https://github.com/hostilefork/CopyMoveConstrainedOptional

Существует также большая группа усилий, чтобы определитьstd::optional что происходит ... но их эталонная реализация не смогла обработать некоторые случаи, которые у меня были:

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

Ваш ответ на вопрос