La norme C++14 ( §5.1.2 ) dit :
Le type de fermeture pour une expression lambda non-générique sans lambda-capture a une conversion const publique non virtuelle et non explicite fonction vers pointeur vers fonction avec un lien avec le langage C++ (7.5) ayant les mêmes types de paramètres et de retour que le type de fermeture. d'appel de fonction du type de fermeture. La valeur renvoyée par cette fonction de conversion de conversion doit être l'adresse d'une fonction qui, lorsqu'elle est invoquée, a le même effet que l'invocation de l'opérateur d'appel de fonction du type de fermeture.
Puisqu'un pointeur de fonction est implicitement convertible en bool
vous obtenez le résultat que vous avez montré. C'est parfaitement légal.
MSVC ne compile pas cela car cet opérateur de conversion est surchargé avec des conventions d'appel différentes ( __stdcall
, __cdecl
etc). Lors de la compilation pour x64
toutes ces conventions d'appel ne sont pas utilisées, il n'y a donc qu'un seul opérateur de conversion et cela compile bien.