usar - variables bool y char en c++



¿Por qué una lambda se convierte en un bool cuyo valor es verdadero? (1)

#include <iostream>

void IsTrue(const bool value) {
  if (value) {
    std::cout << "value is True!\n";
  }
}

int main()
{
  IsTrue([]() { ; /* some lambda */ });

  return 0;
}

Salida:

value is True!

¿Por qué la lambda se evalúa como true en GCC & Clang? MSVC no puede construir esto (no puede convertir lambda en bool).

¿Es un error del compilador? ¿O qué párrafo del estándar permite esto?


El estándar C ++ 14 ( §5.1.2 ) dice:

El tipo de cierre para una expresión lambda no genérica sin lambda-capture tiene una función de conversión de const pública no virtual no explícita a puntero para funcionar con enlace de lenguaje C ++ (7.5) que tiene el mismo parámetro y tipos de retorno que el tipo de cierre operador de llamada de función. El valor devuelto por esta función de conversión será la dirección de una función que, cuando se invoca, tiene el mismo efecto que invocar al operador de llamada de función del tipo de cierre.

Como un puntero de función es implícitamente convertible a bool , obtienes el resultado que has mostrado. Esto es perfectamente legal.

MSVC no compila esto porque este operador de conversión está sobrecargado con diferentes convenciones de llamada ( __stdcall , __cdecl , etc.). Al compilar para x64 no se utilizan todas las convenciones de llamadas, por lo que solo hay un operador de conversión y compila bien.





language-lawyer