2015-04-24 10 views
2

Я в основном пытаюсь делать это сделать:Почему я не могу переместить измененную функцию, которая содержит перенесенное будущее?

using Type = SomeTypeThatIWantToMove; 

std::promise<Type> promised_result; 
std::future<Type> promised_future = promised_result.get_future(); 

using Callback = std::function<void()>; 

Callback function_which_should_be_movable = 
      [this, future_result(std::move(promised_future))]() mutable 
{ 
    this->some_function(future_result.get()); // signature: void some_function(const Type&) 
}; 

using ResultBuilder = std::function<Type(Callback&&)>; 

// result_builder is of type ResultBuilder 
Type thingy = result_builder(std::move(function_which_should_be_movable)); 

MinGW скажите, что Move-конструктор function_which_should_be_movable удаляется, так как копировально-конструктор станд :: будущее будет удален. Однако я не понимаю, почему компилятор попытается скопировать будущее, а не переместить его.

+0

Несчастная реальность заключается в том, что 'std :: function' довольно сильно нарушена. –

ответ

4

function_which_should_be_movable имеет тип std::function. По cppreference:

template< class F > function(F f);F должны отвечать требованиям из Callable и CopyConstructible.

Выражение лямбда, которое вы пытаетесь использовать для создания объекта std::function, не может быть скопировано, и, следовательно, проблема.

Что касается причин, почему std::function имеет это требование, пожалуйста, ознакомьтесь с этим вопросом: Why the initializer of std::function has to be CopyConstructible? (что задается именно мною). Проще говоря, техника стирания типа, используемая std::function, будет создавать экземпляр-копия F. Это происходит независимо от того, действительно ли вы, пользователь объекта std::function, использовали этот экземпляр-конструктор или нет.

+0

В этом случае, какова точка выражения Lambda capture C++ 14? Идея состоит в том, чтобы разрешить что-то вроде этого: std :: unique_ptr ptr (new int (10)); auto lambda = [значение = std :: move (ptr)] {return * значение;}; Итак, зачем мне что-то перемещать в объект функции, если сам объект функции застревает на своем месте навсегда, потому что перемещенный объект отключает копирование или перемещение. –

+0

Тогда вам нужно что-то другое, чем 'std :: function'. Что-то вроде этого, но без стирания типа. Таким образом, вы можете избежать создания экземпляра экземпляра-копии, не используя его. – Lingxi

+0

Построение объекта функции не является проблемой, даже если функция_which_should_be_movable не будет скопирована. Я могу построить его и назвать его на месте. Ошибка возникает только при попытке перемещения объекта. Но опять же: я не понимаю, почему удаленный экземпляр-конструктор мешает мне переместить функцию. Где вызов-конструктор вызван в процессе перемещения? –

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

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