2011-01-31 19 views
26

Per il seguente codice:C++ 11 lambda a decltype

auto F(int count) -> decltype([](int m) { return 0; }) 
{                
    return [](int m) { return 0; };         
} 

g ++ 4.5 dà gli errori:

test1.cpp:1:32: error: expected primary-expression before 'int' 
test1.cpp:1:32: error: expected ')' before 'int' 

qual è il problema? Qual è il modo corretto per restituire un lambda da una funzione?

risposta

39

Non è possibile utilizzare un'espressione lambda se non in realtà la creazione che agli oggetti che rende impossibile il passaggio di digitare la deduzione come decltype.

Ironia della sorte, naturalmente, le regole di ritorno lambda fanno in modo che sia possibile restituire lambda da lambda, in quanto vi sono alcune situazioni in cui il tipo di reso non deve essere specificato.

Hai solo due scelte: restituisci un contenitore polimorfico come std::function o rendi F un vero lambda.

auto F = [](int count) { return [](int m) { return 0; }; }; 
+0

+1 per risposta completa –

+3

+1 per chiarire il problema. Ho controllato la bozza SC22-N-4411 e ho trovato una specie di paura la frase che dice che "ogni espressione lambda ha un tipo unico". – 6502

+3

@ 6502: Sì, questo fatto mi ha fatto capire perché la mia dimensione eseguibile è aumentata improvvisamente del 10% a causa di 'stable_sort'. – Mehrdad

9

qualcosa come questo si adatta alle vostre esigenze?

#include <functional> 

std::function<int(int)> F(int count) 
{                
    return [](int m) { return 0; };         
} 
3

Con C++ 14, questo è ora possibile:

auto F(int count) 
{ 
    return [](int m) { return 0; }; 
} 
Problemi correlati