A prima vista, sembra essere semplice zucchero sintattico.
Ma se guardiamo più in profondità, vediamo che è molto più di uno zucchero sintattico, poiché estende le opzioni dell'utente di C ++ per creare tipi definiti dall'utente che si comportano esattamente come tipi predefiniti distinti. In questo, questo piccolo "bonus" è un'aggiunta C ++ 11 molto interessante a C ++.
Ne abbiamo davvero bisogno in C ++?
Vedo pochi usi nel codice che ho scritto negli anni passati, ma solo perché non l'ho usato in C ++ non significa che non sia interessante per un altro sviluppatore C ++ .
Avevamo usato in C ++ (e in C, immagino), valori letterali definiti dal compilatore, per digitare numeri interi come numeri interi corti o lunghi, numeri reali come float o double (o anche double long) e stringhe di caratteri come caratteri normali o ampi .
In C ++, abbiamo avuto la possibilità di creare i nostri tipi (cioè classi), potenzialmente senza costi generali (inline, ecc.). Abbiamo avuto la possibilità di aggiungere operatori ai loro tipi, per farli comportare come tipi integrati simili, il che consente agli sviluppatori C ++ di utilizzare matrici e numeri complessi nel modo più naturale che avrebbero se fossero stati aggiunti al linguaggio stesso. Possiamo anche aggiungere operatori di cast (che di solito è una cattiva idea, ma a volte è la soluzione giusta).
Ci mancava ancora una cosa che i tipi di utenti si comportassero come tipi predefiniti: valori letterali definiti dall'utente.
Quindi, suppongo sia una naturale evoluzione per il linguaggio, ma per essere il più completo possibile: " Se vuoi creare un tipo e vuoi che si comporti il più possibile di un tipo incorporato, ecco gli strumenti. .. "
Immagino che sia molto simile alla decisione di .NET di trasformare ogni primitiva in una struttura, inclusi valori booleani, interi, ecc. E che tutte le strutture derivino da Object. Questa decisione da sola pone .NET molto al di fuori della portata di Java quando si lavora con le primitive, non importa quanti hack di boxe / unboxing Java aggiungerà alle sue specifiche.
Ne hai davvero bisogno in C ++?
A questa domanda devi rispondere. Non Bjarne Stroustrup. Non Herb Sutter. Non qualunque sia il membro del comitato standard C ++. Questo è il motivo per cui hai la scelta in C ++ e non limiteranno una notazione utile ai soli tipi predefiniti.
Se ne hai bisogno, allora è una gradita aggiunta. Se non lo fai, beh ... Non usarlo. Non ti costerà nulla.
Benvenuto in C ++, la lingua in cui le funzionalità sono opzionali.
Gonfio ??? Mostrami i tuoi complessi !!!
C'è una differenza tra gonfio e complesso (gioco di parole intenzionale).
Come mostrato da Niels su Quali nuove funzionalità aggiungono letterali definiti dall'utente al C ++? , poter scrivere un numero complesso è una delle due funzionalità aggiunte "recentemente" a C e C ++:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
Ora, sia il tipo "doppio complesso" C99 che il tipo "std :: complex" C ++ possono essere moltiplicati, aggiunti, sottratti, ecc., Utilizzando il sovraccarico dell'operatore.
Ma in C99, hanno appena aggiunto un altro tipo come tipo incorporato e il supporto di sovraccarico dell'operatore integrato. E hanno aggiunto un'altra caratteristica letterale integrata.
In C ++, hanno appena usato le funzionalità esistenti del linguaggio, hanno visto che l'elemento letterale era una naturale evoluzione del linguaggio e quindi l'hanno aggiunto.
In C, se hai bisogno dello stesso miglioramento della notazione per un altro tipo, sei sfortunato fino a quando fai pressioni per aggiungere le tue funzioni di onda quantistica (o punti 3D o qualsiasi tipo di base che stai usando nel tuo campo di lavoro) al Lo standard C come tipo incorporato ha esito positivo.
In C ++ 11, puoi farlo tu stesso:
Point p = 25_x + 13_y + 3_z ; // 3D point
È gonfio? No , c'è la necessità, come dimostrato da come entrambi i complessi C e C ++ hanno bisogno di un modo per rappresentare i loro valori complessi letterali.
È stato progettato in modo errato? No , è progettato come qualsiasi altra funzionalità C ++, con in mente l'estensibilità.
È solo a scopo di notazione? No , in quanto può persino aggiungere la sicurezza dei tipi al tuo codice.
Ad esempio, immaginiamo un codice orientato CSS:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
È quindi molto semplice applicare una digitazione forte all'assegnazione dei valori.
È pericoloso?
Buona domanda. Queste funzioni possono avere lo spazio dei nomi? Se sì, allora Jackpot!
Ad ogni modo, come tutto, puoi ucciderti se uno strumento viene usato in modo improprio . C è potente e puoi sparare la testa se usi la pistola C. C ++ ha la pistola C, ma anche il bisturi, il taser e qualsiasi altro strumento che troverai nel toolkit. Puoi abusare del bisturi e sanguinare a morte. Oppure puoi creare un codice molto elegante e robusto.
Quindi, come ogni funzione C ++, ne hai davvero bisogno? È la domanda a cui devi rispondere prima di usarlo in C ++. Se non lo fai, non ti costerà nulla. Ma se ne hai davvero bisogno, almeno, la lingua non ti deluderà.
L'esempio della data?
Il tuo errore, mi sembra, sta mescolando gli operatori:
1974/01/06AD
^ ^ ^
Questo non può essere evitato, poiché / essendo un operatore, il compilatore deve interpretarlo. E, AFAIK, è una buona cosa.
Per trovare una soluzione al tuo problema, scriverei il letterale in qualche altro modo. Per esempio:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
Personalmente, sceglierei le date intere e ISO, ma dipende dalle VOSTRE esigenze. Qual è il punto centrale di permettere all'utente di definire i propri nomi letterali.