2015-01-08 19 views
9

Il seguente programma è illegale, e vorrei capire perché:Perché non posso passare un lambda a questa funzione che accetta una funzione std ::?

#include <functional> 
#include <iostream> 

template<typename Result, typename Arg> 
void deduce(std::function<Result(Arg)> f) 
{ 
    std::cout << "Result: " << typeid(Result).name() << std::endl; 
    std::cout << "Arg: " << typeid(Arg).name() << std::endl; 
} 


int main() 
{ 
    auto f = [](int x) 
    { 
    return x + 1; 
    }; 

    deduce(f); 

    return 0; 
} 

clang 's uscita:

$ clang -std=c++11 test.cpp 
test.cpp:48:3: error: no matching function for call to 'deduce' 
    deduce(f); 
    ^~~~~~ 
test.cpp:26:6: note: candidate template ignored: could not match 'function<type-parameter-0-1 (type-parameter-0-0)>' against '<lambda at test.cpp:34:13>' 
void deduce(std::function<T2(T1)> f) 
    ^
1 error generated. 

Sembra che dovrei essere in grado di convertire il mio lambda al std::function ricevuto da deduce. Perché non è possibile che il compilatore applichi una conversione appropriata in questo caso?

risposta

5

Il problema è che, mentre un lambda che prende un int e restituisce un int può essere convertito in un std::function<int(int)>, il suo tipo è nonstd::function<int(int)> ma un tipo di implementazione definito arbitrario Credo.

È possibile aggirare il problema dicendo al compilatore quali tipi si desidera. Quindi la conversione avverrà come previsto.

auto f = [](int x){ return x + 1; }; 
deduce<int, int>(f); // now ok 

alternativa, essere esplicito del tipo statico di f.

std::function<int(int)> f = [](int x){ return x + 1; }; 
deduce(f); // now also ok 
+0

Grazie. Capisco che i tipi non sono gli stessi, ma sto cercando di capire perché il compilatore non è in grado di applicare una conversione appropriata qui. –

+2

Il problema non è la conversione del valore dell'argomento ma la deduzione dei parametri del modello. Una volta che sono conosciuti (come nel primo frammento che ho dato), la conversione va bene. Proverò se riesco a trovare le regole esatte che sono in vigore qui. – 5gon12eder

+1

Sì, la detrazione è il problema. Sarà una deduzione esatta, perché altrimenti tutto va: qualsiasi specializzazione può o non può avere la conversione necessaria. – Deduplicator

Problemi correlati