Подтвердить что ты не робот

Можно ли переместить boost:: optional?

Я пытался определить конструктор перемещения по умолчанию в классе с переменной 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 без изменения исходного кода Boost? Или я должен ждать, пока Boost поддерживает перемещение?

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

4b9b3361

Ответ 1

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

См. Переместить конструктор - Q & A:

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

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

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

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

Ответ 3

Непонятно, насколько высоко в повестке дня С++ 11 поддерживает поддержку boost:: optional.

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

https://github.com/hostilefork/CopyMoveConstrainedOptional

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

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