2012-05-28 1 views
22

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

+3

Кто-то в #boost указал мне на это: https://svn.boost.org/trac/boost/ticket/1841 –

ответ

17

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

См Move constructor — Q&A:

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

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

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

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

+0

Это правильная диагностика, но вам нужно лекарство, чтобы завершить этот ответ! –

+0

Ты заставил меня думать Люка!) –

+0

Хм, это несчастливо. Я мог бы написать класс-оболочку, поддерживающий перемещение с помощью 'std :: swap' и неявное преобразование в' boost :: optional'. Надеюсь, это будет исправлено в следующей версии Boost. –

3

Непонятно, как высоко на повестке дня C++ 11 поддерживает функцию boost :: optional is.

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

https://github.com/hostilefork/CopyMoveConstrainedOptional

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

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

18

Boost.Optional поддерживает перемещение конструкции только с подталкивания версии 1.56. См. the release notes.

 Смежные вопросы

  • Нет связанных вопросов^_^