Pourquoi un lambda se convertit-il en un bool dont la valeur est vraie?

#include  void IsTrue(const bool value) { if (value) { std::cout << "value is True!\n"; } } int main() { IsTrue([]() { ; /* some lambda */ }); return 0; } 

Sortie:

 value is True! 

Pourquoi le lambda est-il considéré comme true sur GCC et Clang? MSVC ne peut pas générer cela (impossible de convertir lambda en bool).

Est-ce un bogue du compilateur? Ou quel paragraphe de la norme le permet?

Le standard C ++ 14 ( §5.1.2 ) dit:

Le type de fermeture pour une expression lambda non générique sans capture lambda a une fonction de conversion const non virtuelle publique non explicite en pointeur pour fonctionner avec une liaison de langage C ++ (7.5) ayant les mêmes types de paramètre et de retour que le type de fermeture opérateur d’appel de fonction. La valeur renvoyée par cette fonction de conversion doit être l’adresse d’une fonction qui, lorsqu’elle est invoquée, a le même effet que l’appel de l’opérateur d’appel de fonction du type de fermeture.

Comme un pointeur de fonction est implicitement convertible en bool , vous obtenez le résultat que vous avez montré. Ceci est parfaitement légal.

MSVC ne comstack pas cela car cet opérateur de conversion est surchargé avec différentes conventions d’appel ( __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 comstack bien.