2010-07-02 16 views
11

Eventuali duplicati:
How are you using C++0x today?usare o non usare C++ 0x dispone

Sto lavorando con un team su un abbastanza nuovo sistema. Stiamo parlando della migrazione a MSVC 2010 e abbiamo già eseguito la migrazione a GCC 4.5. Questi sono gli unici compilatori che stiamo utilizzando e non abbiamo in programma di trasferire il nostro codice a compilatori diversi in qualsiasi momento.

Ho suggerito che dopo averlo fatto, iniziamo a sfruttare alcune delle funzionalità di C++ 0x già fornite come auto. Il mio collega ha suggerito questo, proponendo di aspettare "fino a quando C++ 0x non diventerà standard". Non sono d'accordo, ma riesco a vedere l'appello nel modo in cui l'ha formulata. Tuttavia, non posso fare a meno di pensare che questa contro-argomentazione derivi più dalla paura e dalla trepidazione dell'apprendimento del C++ 0x che da una vera preoccupazione per la standardizzazione.

Dato il nuovo stato del sistema, voglio che sfruttiamo la nuova tecnologia disponibile. Solo l'auto, ad esempio, renderebbe la nostra vita quotidiana più facile (basta scrivere cicli basati su iteratore fino a che non si verifichino loop basati su intervalli, ad es.).

Ho sbagliato a pensare questo? Non è come se proponessi di cambiare radicalmente il nostro codice base in erba, ma semplicemente iniziare a utilizzare le funzionalità di C++ 0x dove conveniente. Sappiamo quali compilatori stiamo usando e non abbiamo piani immediati di porting (se portiamo il codice base, allora sicuramente i compilatori saranno disponibili anche con le caratteristiche di C++ 0x per la piattaforma di destinazione). Altrimenti mi sembra di evitare l'uso di iostream nel 1997 solo perché lo standard ISO C++ non è stato ancora pubblicato nonostante tutti i compilatori li abbiano già forniti in modo portatile.

Se siete tutti d'accordo, potreste fornirmi argomenti che potrei usare per rafforzare la mia posizione? In caso contrario, potrei avere un po 'più di dettagli su questa idea "fino a quando il C++ 0x è standard"? A proposito, qualcuno sa quando sarà?

+0

Ti piacerebbe quantificare cosa intendi per "in qualunque momento presto"? –

+1

@Neil fino a quando non arrivano alternative per Windows e Linux che sono così buone da rendere GCC/MSVC obsoleto. – stinky472

risposta

10

Prenderei la decisione in base alle funzionalità.

Ricordare che lo standard è veramente vicino al completamento. Tutto ciò che rimane sono il voto, la correzione dei bug e più voti.

Quindi una semplice funzione come auto non sta per andare via, o avere la sua semantica cambiata. Quindi, perché non usarlo.

Lambdas sono abbastanza complessi da poter cambiare la loro formulazione e la semantica in alcuni casi d'angolo risolta un po ', ma nel complesso, si comportano come fanno oggi (anche se VS2010 ne ha alcuni bug riguardanti l'ambito delle variabili catturate, MS ha dichiarato che sono bug e in quanto tali possono essere risolti al di fuori di una versione principale del prodotto).

Se si vuole giocare sul sicuro, stare lontano da lambda. Altrimenti, usali dove sono convenienti, ma evita i casi più complicati, o semplicemente sii pronto a ispezionare l'utilizzo di lambda quando lo standard è finalizzato.

La maggior parte delle funzionalità può essere classificata in questo modo, sono così semplici e stabili che la loro implementazione in GCC/MSVC è esattamente come funzioneranno nello standard finale, oppure sono abbastanza complicate da si applicano alcune correzioni di bug e quindi può essere utilizzato oggi,, ma si corre il rischio di imbattersi in alcuni bordi grezzi in alcuni casi di confine.

Sembra sciocco evitare la funzionalità C++ 0x solo perché non sono ancora stati formalizzati. Evita le funzionalità che non ti aspetti di essere complete, prive di bug e stabili, ma usa il resto.

+0

Grazie Jalf per il consiglio! Lo prenderò e vedrò se riesco a convincere i miei collaboratori ad utilizzare in modo selettivo alcune funzionalità di C++ 0x. Per fornire un po 'di background, sono in una squadra che è riluttante a utilizzare la libreria standard sulle proprie collezioni gestite manualmente. Parte del motivo è che odiano la sintassi iteratore. Lentamente sempre più persone sono venute ad usarle quando si rendono conto che non c'è una buona ragione per non farlo, ma c'è ancora un sacco di lamentele riguardo la sintassi coinvolta, per esempio, in un ciclo di loop basato sull'iterazione. Non mi dava fastidio dato che scrivevo tutto e la ridondanza sintattica non – stinky472

+0

mi [...] infastidisce più di tanto (solo ridondanza logica), ma potrebbe aiutare a far entrare più persone con C++ in modo corretto se solo avessimo, diciamo, auto. – stinky472

+0

@ stinky472: Non c'è alcuna ragione per non usare C++ 0x se si sa che si ha un compilatore che lo supporta. Ricorda che C++ 0x può offrire molti miglioramenti delle prestazioni e altre cose che C++ 03 non è in grado di offrire. È vero che teoricamente, una funzionalità potrebbe essere cambiata. Ma il costo di cambiarlo quando si aggiorna e lo standard è finito è molto meno del costo di non usare riferimenti rvalue, auto, decltype, modelli variadici. – Puppy

8

teoriche ma non pratici svantaggi di usare C++ 0x:

  • rende più difficile da porto a diversi compilatori.
  • Non aderente a nessuno standard pubblicato.

pratici vantaggi di utilizzare C++ 0x:

  • rende la vostra vita quotidiana più facile, quindi più produttivo.

È un dibattito tra ciò che è teoricamente giusto e ciò che è pratico. Se la tua squadra ha intenzione di fare qualcosa con questo codice, la pratica dovrebbe superare la decuplicazione teorica.

+0

In particolare se sei assolutamente certo (come sembra) di non portare questo codice a un sistema il cui compilatore non lo ha (ancora) capito. Posso simpatizzare con gli "standard sono buoni" pensando al tuo collega (forse un po 'troppo * bene: P) ma se non ci sono effettive conseguenze negative, è solo un ostacolo inutile. – shambulator

+7

Teorico, ma improbabile, svantaggio dell'uso di C++ 0x: A causa di bug nelle due implementazioni che stai utilizzando, o cambiamenti nello standard proposto, il tuo codice potrebbe essere intrappolato su specifiche versioni di gcc/msvc. Esempio: se l'hai fatto circa 7 mesi fa e concetti fortemente utilizzati. Vedere anche: Visual Studio 6. – KitsuneYMG

+0

Se le cose vengono rimosse dallo standard, ma sono già implementate nei compilatori, verranno probabilmente trasformate in un'estensione del compilatore facoltativa invece di essere rimosse del tutto. Quindi è, come dici tu, uno svantaggio teorico ma improbabile. – Thomas

3

Abbiamo avuto lo stesso identico problema, quindi abbiamo compromesso. Abbiamo preso la versione TR1 del C++ 0x e poi abbiamo preso solo le parti che sapevamo di voler utilizzare. Sembra molto lavoro, ma finora ha funzionato bene. Stiamo usando le librerie regex, le tuple e un paio di altre. Una volta ratificato lo standard, migreremo all'intero C++ 0x. Questa ovviamente non è la soluzione migliore, ma è stata quella che ha funzionato bene per noi.

+0

+1 Grazie Nathan per un esempio a cui possiamo confrontare. Sto cercando un compromesso simile: basta andare con le funzionalità FCD già disponibili, non quelle più esotiche che potrebbero subire ulteriori revisioni. – stinky472

7

Una cosa a cui non è necessario (principalmente) preoccuparsi ora è l'aggiunta o la rimozione di funzionalità perché la bozza di lavoro ha raggiunto "Bozza finale commissione" (FCD) a marzo. Le feature dovrebbero essere congelate, il comitato standard non accetterà più proposte per C++ 0x.

Lo svantaggio è che è ancora una bozza e non ancora finalizzato, il comitato degli standard è in fase di correzioni e regolazioni prima di finalizzare e pubblicare lo standard ISO (rilascio previsto per marzo 2011). Ciò potrebbe significare piccole modifiche sintattiche o semantiche/comportamentali che potrebbero rendere il tuo codice non compilabile o non funzionare correttamente una volta compilato con un compilatore che è più conforme a quello standard che stai utilizzando nel momento in cui hai scritto il codice.

Probabilmente dovrete aspettare qualche tempo per compilatori come VC++ 10 per ottenere l'aggiornamento con eventuali correzioni/aggiustamenti effettuati.

+0

Grazie, sottolineando che l'FCD è una grande idea! Penso che forse questo potrebbe permettermi di conquistare qualcuno in questo dibattito se selezioniamo in modo selettivo le funzionalità di C++ 0x che possiamo usare. – stinky472

1

Se si intende rendere il sistema open source in un futuro non troppo lontano, questo è un argomento per non utilizzare troppe funzionalità di spurgo. Un sistema di produzione su cui è in esecuzione Debian o Red Hat non avrà necessariamente un compilatore bleeding-edge installato.

Lei ha detto

se mai porta il codice di base, da allora sicuramente sarà disponibile con C++ 0x compilatori caratteristiche pure per la piattaforma di destinazione

ma che esiste un compilatore per una piattaforma non significa sempre che è installato/usato/voluto, specialmente sui sistemi di produzione.

Se, d'altra parte, si intende eseguire personalmente la compilazione, non si tratta di un problema.

+0

+1 Grazie Lajnoid e io non ho preso in considerazione le distribuzioni di Linux. Potremmo voler supportare altre distribuzioni che potrebbero essere limitate a versioni precedenti di GCC. Dovrò sollevare quel punto come un problema legittimo da prendere in considerazione, ma spero che potremo utilizzare alcune delle funzionalità di base del linguaggio C++ 0x, invece di aspettare anni prima di poterne beneficiare. – stinky472