47 votes

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

#include <iostream>

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 évalué à true sur GCC et Clang ? MSVC ne peut pas le construire (ne peut pas convertir lambda en bool).

Est-ce un bug du compilateur ? Ou quel paragraphe de la norme permet cela ?

45voto

sasauke Points 301

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X