Una función sobrecargada debería incluir a ambos functores, dado que el tipo de lambda es decidible (se puede convertir en un std::function
(corríjame si me equivoco). La pregunta es: ¿Por qué hay un error de compilación a continuación, a pesar de que el tipo de lambda es explícitamente? definido? ( [&]() -> Type {}
)
Tenga en cuenta que para mi solución actual necesito la captura por referencia, es por eso que el código contiene la lógica para ello.
El siguiente ejemplo describe el problema:
#include <iostream>
#include <string>
#include <functional>
void do_some(std::function<void(int)> thing)
{
thing(5);
}
void do_some(std::function<bool(int)> thing)
{
if (thing(10))
{
std::cout << "it's true!" << std::endl;
}
}
int main()
{
int local_to_be_modified = 0;
do_some(
[&](int in)
{
local_to_be_modified = in;
std::cout << "This is void-" << std::endl;
}
);
do_some(
[&](int in) -> bool
{
// error: call to 'do_some' is ambiguous
local_to_be_modified += in;
std::cout << "This is bool-" << std::endl;
return true;
}
);
}
c++
c++11
lambda
implicit-conversion
std-function
David Tóth
fuente
fuente
std::function<void(int)>
se puede construir incluso a partir de una lambda que devuelve algo (lo que hace que se ignore el valor de retorno).Respuestas:
Porque la segunda expresión lambda que regresa
bool
podría convertirse en ambosstd::function<void(int)>
estd::function<bool(int)>
implícitamente.std::function
tiene un constructor de conversión:Como la definición de invocable ,
Tenga en cuenta que la segunda lambda que regresa
bool
, ya questd::function<void(int)>
, como se muestra arriba,static_cast<void>(INVOKE(f, t1, t2, ..., tN))
es una expresión válida (la devueltabool
se acaba de convertir avoid
). Entonces también podría convertirsestd::function<void(int)>
implícitamente y causar el problema de ambigüedad.fuente
Puede explícitamente
static_cast
la lambda al tipo apropiadoO almacene el lambda en el
std::function<bool(int)>
tipo apropiado y pase a la función (si sedo_some(lmda)
debe llamar muchas veces)O como sugirió @MaxLanghof, simplemente construya
std::function<bool(int)>
desde lambda sobre la marchafuente
static_cast
y simplemente construir unstd::function
directamente desde él. Eso es todo lo que sucede durante la conversión implícita de todos modos.static_cast<
último>
y último y hará lo mismo pero con menos tipeo. No necesita más líneas ni nada. godbolt.org/z/fQTqF4