es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿C++ no puede llamar a set_value para una promesa capturada por movimiento en una lambda?

Estoy intentando escribir un método bastante simple que devuelve un futuro. Una lambda establece el futuro. Este es un ejemplo mínimo. En realidad, la lambda puede ser invocada en un hilo diferente, etc.

“`c++

include <future>

std::future<std::errorcode> dosomething() {
std::promise<std::errorcode> p;
auto fut = p.getfuture();
auto lambda = [p = std::move(p)] {
std::errorcode error;
p.setvalue(error);
};
lambda();
return std::move(fut);
}

int main() { return do_something().get().value(); }
“`

Por alguna razón, obtengo un error de tipo. El intellisense de VSCode dice:

no instance of overloaded function “std::promise<_Ty>::set_value [with _Ty=std::error_code]” matches the argument list and object (the object has type qualifiers that prevent a match) — argument types are: (std::remove_reference_t) — object type is: const std::remove_reference_t<std::promise &>

Y el compilador MSVC dice:

error C2663: ‘std::promise::set_value’: 2 overloads have no legal conversion for ‘this’ pointer

Realmente no entiendo el error de VS Code. ¿Está diciendo que cree que error es una constante promise? ¿Cómo llamo correctamente a set_value en una promise que se movió dentro de la captura de una lambda?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que estás intentando llamar a set_value en un objeto const. El lambda captura el promise por valor, lo que lo convierte en const. Para solucionar esto, necesitas capturar el promise por referencia en su lugar. Esto se puede hacer cambiando la lista de captura a [&p = std::move(p)] en lugar de [p = std::move(p)].

    Esto te permitirá llamar a set_value en el objeto promise sin ningún error.

Comments are closed.