he intentado lo siguiente:Cómo capturar un unique_ptr en una expresión lambda?
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething){
//The caller given ownership of psomething
return [psomething](){
psomething->do_some_thing();
//psomething is expected to be released after this point
};
}
Pero no compila. ¿Algunas ideas?
ACTUALIZACIÓN:
como se sugiere, se requiere alguna nueva sintaxis para especificar explícitamente que necesitamos para transferir la propiedad a la lambda, ahora estoy pensando en la siguiente sintaxis:
std::function<void()> getAction(std::unique_ptr<MyClass> psomething){
//The caller given ownership of psomething
return [auto psomething=move(psomething)](){
psomething->do_some_thing();
//psomething is expected to be released after this point
};
}
¿Sería un buen candidato?
ACTUALIZACIÓN 1:
voy a mostrar mi aplicación de move
y copy
de la siguiente manera:
template<typename T>
T copy(const T &t) {
return t;
}
//process lvalue references
template<typename T>
T move(T &t) {
return std::move(t);
}
class A{/*...*/};
void test(A &&a);
int main(int, char **){
A a;
test(copy(a)); //OK, copied
test(move(a)); //OK, moved
test(A()); //OK, temporary object
test(copy(A())); //OK, copying temporary object
//You can disable this behavior by letting copy accepts T &
//test(move(A())); You should never move a temporary object
//It is not good to have a rvalue version of move.
//test(a); forbidden, you have to say weather you want to copy or move
//from a lvalue reference.
}
Esa es la solución ideal. –
¿Cuándo se libera el puntero único en estas circunstancias? Cuando la lambda lo hace? – Leo
@Leo El puntero único se debe mover al bloque de datos de la lambda (una lambda es solo un objeto con el operador '()') y luego se libera después de que se libera el objeto lambda. El objeto lambda como valor r puede liberarse después de 'go.run' si no se mueve. Si se mueve, puede liberarse en cualquier momento después de esto, y esto tiene sentido si desea programar 'do_something_with' para que se ejecute más tarde. –