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?
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. –
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
Sì, la detrazione è il problema. Sarà una deduzione esatta, perché altrimenti tutto va: qualsiasi specializzazione può o non può avere la conversione necessaria. – Deduplicator