2011-02-11 17 views
7

Ecco il mio dilemma: mi piace molto lambda e ho usato molto Boost.Fusion e Phoenix. Sono abbastanza maturi e giocano bene su molti compilatori.Dovrei usare ora C++ 11 lambda?

E i lambda in C++ 11? Sono davvero belli e molto più facili da usare, quindi aumentano le alternative (non più i funtori!). I recenti compilatori ICC e GCC li supportano. Ma ci sono ancora molti sistemi ICC 9.x e GCC 4.1 e successivi, per non parlare dei compilatori XL e Sun. Questi compilatori offrono il supporto per lambda?

Tendo a pensare che forse dovrei aspettare di usare le caratteristiche del C++ 11 per evitare che i sistemi più vecchi rifiutino il codice. Cosa ne pensi? Aspetta che i vecchi compilatori svaniscano o semplicemente lo facciano?

+0

@Jagannath: la standardizzazione * verrà * completata? C'era il vecchio "C++ 0x è in esadecimale", ma, come ho scherzato in rappresaglia prima, se il 0x è in esadecimale, lo è anche l'implicito 20, così da dare loro fino all'8105. Prima ho detto che scherzo qualche tempo fa. – Steve314

+0

@Steve: dovremmo sapere il prossimo mese dopo la riunione della commissione a Madrid. –

risposta

13

Avete bisogno di essere in grado di compilare il codice utilizzando un compilatore che non supporta C++ 11 lambda?

Se è così, non è possibile utilizzarli (ovviamente). Altrimenti, non c'è davvero molto motivo per non usarli.

Ci sono stati alcuni cambiamenti alle specifiche di espressioni lambda in C++ 11, quindi c'è poco rischio di utilizzarli ora. Certamente ci saranno occasionali bug del compilatore, ma per la maggior parte quelli sono pochi e distanti tra loro.

L'unica funzionalità principale correlata a lambda, di cui sono a conoscenza che non è supportata dalle ultime versioni di più compilatori che supportano espressioni lambda, è stata aggiunta lo scorso marzo, consentendo di convertire implicitamente i lambda in modo implicito in puntatori di funzione . Visual C++ 2010 e Intel C++ 11.1 non supportano questo (non ho una versione successiva di Intel C++ con cui testare, mi dispiace). Visual C++ 11 supporta tuttavia la conversione implicita.

+0

In linea di principio sì, ma potrebbe essere 1-2 anni da oggi. Inoltre, potrebbe essere necessario acquistare un compilatore XL più recente, ad esempio. E non so se IBM aggiornerà alcuni dei loro compilatori specializzati (ad esempio BlueGene) – Anycorn

+2

@aaa: Quindi è necessario bilanciare il rischio che si dovrà applicare il codice di porta a un compilatore più vecchio domani contro la ricompensa dell'uso di lambda espressioni nel tuo codice oggi. Non so abbastanza della tua situazione per sapere come andrà a finire. Alla fine, solo tu puoi prendere quella decisione. –

5

Stai mirando a più compilatori? Allora no. Se sai con precisione quale compilatore stai mirando e gestiscono la sintassi allo stesso modo, allora vai avanti e usa le nuove funzionalità!

1

Nel proprio codice, assolutamente, provaci. È un'idea eccellente, infatti.

Per lavoro, StackOverflow non è il posto giusto per chiedere. A meno che tu non sia il decisore sul luogo di lavoro, e il tuo compilatore sappia di cosa stai parlando. In tal caso ti incoraggio ad essere fantastico.

3

La mia prospettiva è che se si sta lavorando sul codice della libreria, probabilmente si dovrebbe aspettare. Voglio dire, se vuoi raggruppare una libreria insieme per la distribuzione open-source o l'uso in un pacchetto commerciale multipiattaforma, allora puoi a malapena controllare quale supporto del compilatore per lambdas sarà disponibile e come si comporterà. Fortunatamente, le espressioni lambda, per quanto belle, riguardano principalmente lo zucchero sintattico. Non offrono più funzionalità dei funtori tradizionali, ma lo rendono semplicemente più carino e localizzato (naturalmente, potrei sbagliarmi, la mia conoscenza degli usi di lambda è piuttosto superficiale). Ma, in genere, una biblioteca ha lo scopo di nascondere la bruttezza dell'attuazione. E se hai intenzione di rendere questa libreria utilizzabile su compilatori che non supportano lambda, dovrai comunque fornire le implementazioni portatili alternative. Quindi, a meno che non vi sia un chiaro vantaggio nell'uso di lambda nella libreria (in termini di efficienza (tempo di compilazione o tempo di esecuzione) o nell'esperienza utente (ad esempio se si utilizza lambdas per rendere l'uso della libreria più semplice o più chiaro o più intuitivo)), probabilmente non ne vale la pena.

Tuttavia, per il codice lato utente, è più facile controllare le piattaforme di destinazione e/o compilatori per il software. In tal caso, se tutti i compilatori che si prevede di utilizzare supportano lambdas .. allora impazzisci!

Ora il punto filosofico, gli standard sono lì per le persone a conformarsi a loro.Ciò include naturalmente le persone che fanno i compilatori, ma anche le persone che li usano. Quando le persone iniziano a scrivere belle librerie e/o software che richiede il supporto lambda, le persone che vogliono usarle inizieranno a lamentarsi con i produttori di compilatori per aggiungere il supporto, che a loro volta motiverà le persone a usare lambda .. e così fa la palla rotolare.

Infine, giudicando la quantità di buzz che questo nuovo standard sta sollevando e l'eccitazione che si sta formando in attesa della sua uscita, penso che i programmatori saranno pronti a rendere questo standard "lo standard", e i produttori di compilatori devono seguire l'esempio per rimanere in vita.

+0

Sì, hai ragione: le espressioni lambda sono interamente sintattiche di zucchero. –