2013-04-03 4 views
6

in C++ 11, questo è ora sintassi valida:Modelli C++. Staffe angolari Pitfall - Qual è la correzione C++ 11?

vector<vector<float>> MyMatrix; 

mentre in precedenza, doveva essere scritto come questo (notare lo spazio):

vector<vector<float> > MyMatrix; 

La mia domanda è quale sia la risolvi che lo standard utilizza per consentire la prima versione?

Potrebbe essere semplicemente come rendere > un token invece di >>? Se non è così, cosa non funziona con questo approccio?

Ritengo che forme come myTemplate< x>>3 > non siano un problema, poiché è possibile disambiguarle eseguendo myTemplate<(x>>3)>.

+1

'>' è * già * un token ma il parser è ed era avido. La correzione deve quindi apparire diversa. - Una possibilità sarebbe naturalmente quella di rendere '>>' * non * un gettone. –

+2

Suppongo che stiate cercando §14.2.3: * "Quando si analizza un elenco argomento-modello, il primo non annidato viene preso come delimitatore finale piuttosto che come operatore maggiore di. nested >> viene considerato come due token consecutivi ma distinti, il primo dei quali viene considerato come la fine dell'elenco template-argument e completa l'id-modello "* – Zeta

+2

" qual è la correzione che lo standard utilizza per consentire la prima versione "- Credo che questo non abbia nulla a che fare con _Lo standard_. Voglio dire - l'implementazione. Credo che sia una decisione del compilatore come implementare questo requisito, forzato da _Lo standard_. –

risposta

12

Viene risolto aggiungendo un caso speciale alle regole di analisi durante l'analisi degli argomenti del modello.

C++ 11 14,2/3: Quando analizza un modello -argomento-lista, la prima non annidata > è preso come il delimitatore finale piuttosto che un operatore maggiore. Analogamente, il primo >> non nidificato viene considerato come due token consecutivi, ma distinti >, il primo dei quali viene considerato come la fine dell'elenco di argomenti modello e completa l'id modello .

+1

Sembra un difetto. IIRC, l'intento era che qualcosa come 'modello classe X {}; X <(10 >> 2)> '(con le parentesi in più) sarebbe legale. –

+2

@JamesKanze Isn 'che è coperto dalla parte "non nidificata"? – Norswap

+0

Lasciatemi riformulare la mia seconda domanda: perché non hanno rilasciato il token '>>', e semplicemente usano due token '>' ovunque è richiesto un passaggio a destra? Sembra una soluzione più semplice. – Norswap