2015-06-24 14 views
5

L'elemento 13 di "Effective Modern C++" di Scott Mayers afferma di preferire i costitutori su iteratori. Sono d'accordo ma voglio anche usare funzioni non membro piuttosto che funzioni membro. Secondo il libro ci dovrebbe essere una funzione non membro std::cbegin() e std::cend() in C++ 14.Supporto di `std :: cbegin()` in C++ 14

Per utilizzare queste funzioni ho appena installato gcc versione 4.9.2 e compilato con la flag -std=c++14. Sembra compilare fino a quando non cerco di usare std::cbegin(). Inizio a cercare il supporto per questa funzione ma non sono riuscito a trovare nulla a riguardo. Ad esempio, a gnu onlinedocs status la funzione non viene nemmeno menzionata.

La mia domanda è, sarà std::cbegin() e std::cend() davvero supportato in C++ 14 o si tratta di un errore nel libro? Se sarà una funzionalità di C++ 14, ci sono compilatori che supportano già queste funzioni e quando gcc lo supporterà?

Ci sono molte domande su SO su begin() ma queste domande riguardano le funzioni membro o la constexpr-ness e non il supporto della variante non membro.

risposta

1

Il supporto di GCC 4.9 per C++ 14 è sperimentale e incompleto. Ma here, si può vedere che

funzioni globali CBEGIN, CEND, rbegin, rend, crbegin e crend ​​per l'accesso gamma di contenitori, gli array e le liste di inizializzazione.

sono stati aggiunti in GCC 5.1.

2

Sì, sono in C++ 14. Sono stati aggiunti da un library issue, non da un foglio di carta, e sembra che la pagina di manuale di libstdC++ non tenga traccia dei problemi di libreria.

Sono implementati in GCC 5.1. Vedi GCC bug 64656.

+0

Era la mia proposta. Solo che non l'ho scritto io stesso perché dovrebbe essere scritto al posto mio da un membro del Comitato. :) –

1

Sì, lo sono, cppreference li descrive lungo begin/end.

E lo standard lo definisce nella sezione 24.7 - Range access. Non lo sto citando perché è un insieme di definizioni di funzioni template che concordano con i link sopra.

Il progetto, che dovrebbe essere molto vicino alla versione finale (non riesco a ricordare il numero per la stesura finale, sorry): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

È un dato di fatto, è possibile giocare con esempi incorporati su il cppreference e cambiare begin e end chiamate a cbegin/cend e provare a eseguirli. gcc 4.9 lamenta, sebbene gcc 5.1 funzioni già, nonché clang 3.6. Quindi è solo una questione di supporto per il compilatore.

Problemi correlati