Une fonction surchargée devrait prendre les deux foncteurs, étant donné que le type du lambda est décidable (transtypable en un std::function
(veuillez me corriger si je me trompe). La question est: pourquoi y a-t-il une erreur de compilation ci-dessous, alors que le type lambda est explicitement défini? ( [&]() -> Type {}
)
Veuillez noter que pour ma solution actuelle, j'ai besoin de la capture par référence, c'est pourquoi le code contient la logique pour cela.
L'exemple suivant décrit le problème:
#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
la source
la source
std::function<void(int)>
peut être construit même à partir d'un lambda qui renvoie quelque chose (ce qui entraîne l'ignorance de la valeur de retour).Réponses:
Parce que la 2ème expression lambda de retour
bool
pourrait se convertir à la foisstd::function<void(int)>
etstd::function<bool(int)>
implicitement.std::function
a un constructeur de conversion:Comme la définition de Callable ,
Notez que le 2ème lambda retournant
bool
, pour lestd::function<void(int)>
, comme indiqué ci-dessus,static_cast<void>(INVOKE(f, t1, t2, ..., tN))
est une expression valide (le retourbool
est juste converti envoid
). Ensuite, il pourrait également se convertir enstd::function<void(int)>
implicitement et provoquer le problème d'ambiguïté.la source
Vous pouvez explicitement
static_cast
le lambda au type appropriéOu stockez le lambda dans le
std::function<bool(int)>
type approprié et passez à la fonction (si elledo_some(lmda)
doit être appelée plusieurs fois)Ou comme @MaxLanghof l'a suggéré, il suffit de construire à
std::function<bool(int)>
partir de lambda en déplacementla source
static_cast
et juste en construire unstd::function
directement. C'est tout ce qui se passe pendant la conversion implicite de toute façon.static_cast<
et dernier>
et il fera la même chose mais avec moins de frappe. Il n'a pas besoin de plus de lignes ou de quoi que ce soit. godbolt.org/z/fQTqF4