La situazione è cambiata nel nuovo standard, C++ 14?
Un lambda espressione non deve ancora apparire in un operando non valutata - la stessa citazione di quello in Xeo's Post esiste anche nel più recente progetto a disposizione del pubblico N3797, nella stessa identica posizione.
Tuttavia, ogni tipo di chiusura presenta un costruttore di default soppresso (N3797, §5.1.2/20):
Il tipo di chiusura associato con un lambda-espressione ha un eliminato (8.4.3) costruttore predefinito e un operatore di assegnazione copie cancellato.
Così, per portabiliby e la conformità standard (e, probabilmente, per il codice di lavorare su compilatori ragionevoli), si avrebbe bisogno di passare un oggetto chiusura al costruttore della classe istanziata da cui copiare. Ma per passare un oggetto chiusura dello stesso tipo come argomento di modello che la specializzazione è necessario definire per prima in ogni caso:
using my_map_type = map<int, int, decltype([] (auto&& lhs, auto&& rhs) {return lhs < rhs*4;})>;
// Assuming the above compiles
my_map_type m([] (auto&& lhs, auto&& rhs) {return lhs < rhs*4;});
// Different closure type - compiler error! What do you copy from!?
Non c'è alcun modo legale per creare un singolo oggetto del tipo di chiusura del primo lambda. Pertanto, anche se tale regola dovesse essere rimossa, non è possibile creare una singola istanza di my_map_type
. Problemi simili si verificano con altri scenari "tipo di chiusura come argomento modello".
Le regole sono state rafforzate in C++ 14 e considerando [le ragioni per escluderle formano operandi non valutati] (http://stackoverflow.com/a/22232165/1708801) Non penso che cambierà. –
Data l'ultima bozza, il testo citato (con enfasi) nel post collegato non è cambiato. Quindi penserei, no, la situazione non era cambiata. – Niall
Er ... La risposta era sì, ma non direttamente. Rendere la mia risposta, che era anche "sì, solo non direttamente" per C++ 14, in qualche modo inutile. – hvd