2015-02-02 3 views
5
codice

hanno come questalambda restituisce '1' tutti i tempi

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<[](){ return 0;}; 
    cout<<[](){ return 3.2;}; 
    cout<<[](){ return true;}; 
    cout<<[](){ return false;}; 
    cout<<[](){ return "Hello world!";}; 
    cout<<[]()->int{ return 0;}; 
    cout<<[]()->double{ return 3.2;}; 
    cout<<[]()->bool{ return true;}; 
    cout<<[]()->bool{ return false;}; 
    cout<<[]()->const char*{ return "Hello world!";}; 
    return 0; 
} 

compilarlo con gcc version 4.8.2 e la mia uscita è solo 1111111111. Perché solo "1"?

+5

Non si chiama mai il lambda: '[]() {return 10;}' vs '([]() {return 10;})()'. – Zeta

+1

In VS 2013 ricevo il messaggio di errore "binario '<<': nessun operatore trovato che prende un operando di destra di tipo 'main :: TobiMcNamobi

+8

Lambdas senza cattura è implicitamente convertibile in un puntatore a funzione, che a sua volta è implicitamente convertibile in 'bool'. –

risposta

7

Quando un'espressione lambda non ha acquisizione, è implicitamente convertibile in un puntatore di funzione.

Un puntatore a funzione, a sua volta, è implicitamente convertibile in bool, restituendo true se il puntatore non è nullo, che viene stampato.

Se si cout << std::boolalpha prima delle uscite, you'll see truetruetrue.... printed instead.

Se si cattura qualcosa nel lambda, non è più convertibile in un puntatore di funzione e you'd get a compiler error.

Se si desidera stampare il risultato restituito chiamando il lambda, quindi è necessario (), come altri hanno sottolineato.

5

quello che dici:

cout<<[](){ return 0;}; 

Che cosa si vuole dire:

cout<<[](){ return 0;}(); 

Vedere la staffa?

+0

Grazie. Ora funziona correttamente. –

5

E se avete fatto queste cose:

#include <iostream> 
using namespace std; 
void foo() 
{ 
} 
int main() 
{ 
    cout<<foo; 
    return 0; 
} 

Non stai chiamando il metodo, ma si tenta di stampare il suo indirizzo. Viene selezionato il sovraccarico operator <<(bool) per cout, quindi per qualsiasi funzione valida che si tenta di stampare, si ottiene 1.

Per chiamare effettivamente la funzione (o lambda), aggiungere ().

+0

Grazie per aver spiegato perché ottengo "1" ogni volta. –