Можно ли переместить 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
в прошлом.
Ответы
Ответ 1
Рассматривая исходный код boost::optional
, он не определяет конструкторы перемещения или перемещает назначения. Тем не менее, он определяет конструктор и назначение копии, которые препятствуют компилятору от автоматического создания конструктора перемещения и назначения для него.
См. Переместить конструктор - Q & A:
компилятор будет неявным образом генерировать конструктор перемещения в виде перемещений по элементам, если только вы явно не определили конструктор копирования или назначение копирования/перемещения или деструктор
Как считает Люк Дантон, для этого нужно быть лекарством. Попробуйте использовать swap
для перемещения boost::optional
в надежде, что создание пустого boost::optional
будет дешевым, а затем мы просто поменяем построенный по умолчанию boost::optional
на один из r-value foo
, например:
foo(foo&& b) {
hello.swap(b.hello);
}
И то же самое для назначения перемещения.
Ответ 2
Boost.Optional поддерживает перемещение конструкции только с версии Boost 1.56. См. примечания к выпуску.
Ответ 3
Непонятно, насколько высоко в повестке дня С++ 11 поддерживает поддержку boost:: optional.
Я нашел симпатичного парня в Интернете, который дал мне часть своего кода под лицензию на увеличение..., которая все еще претерпевает некоторые хитрости. Это в тот момент, когда он работает для меня. Может быть, это поможет любому, кто смотрит на этот вопрос:
https://github.com/hostilefork/CopyMoveConstrainedOptional
Существует также большая группа усилий для определения std::optional
, которая продолжается... но их эталонная реализация не смогла обработать некоторые из случаев, которые у меня были:
http://kojot.sggw.waw.pl/~akrzemi1/optional/tr2.optional.proposal.html