2016-06-06 26 views
15

Come si può vedere dalle https://stackoverflow.com/a/26614984/481267 le seguenti intestazioni sono garantite dallo standard per #include <initializer_list>:Perché le intestazioni C++ specificate includono <initializer_list>?

  • Tutto in [contenitori]
  • <utility>
  • <string>
  • <algorithm>
  • <random>
  • <valarray>
  • <regex>

La maggior parte di queste intestazioni dichiarare almeno una funzione che prende un argomento std::initializer_list<E>, quindi ha senso. Tuttavia,

  • <array>, <stack> e <queue> hanno tali funzioni, anche se forse ha senso trattare tutti i contenitori uniformemente qui.
  • <utility> non ha tali funzioni.
  • <iterator> ha funzioni con un initializer_list argomento (rbegin, rend) ma non è specificato per includere <initializer_list>.

Qual è la logica dietro queste eccezioni?

+0

Penso che persino l'utilizzo dell'inizializzazione uniforme richieda l'inclusione di ''. Vedi i commenti di questa domanda [qui] (http://stackoverflow.com/q/33704978/3093378). – vsoftco

+1

L'inclusione in "" risale al N2672. Il resto è fatto da N2930. 'Rbegin' /' rend' sono aggiunte in ritardo. –

+0

@vsoftco Solo se si utilizza il tipo esplicitamente o implicitamente. –

risposta

1

Sembra che non vi sia una motivazione esplicita, solo che alcune proposte di aggiunte allo standard sono state fatte e quelle proposte sono state accettate.

Alla fine del documento N2672 Initializer List proposed wording si dice solo:

Nel 20,2 componenti Utility [utility] paragrafo 1:

Questa sottoclausola contiene alcuni modelli di funzione e di classe di base che vengono utilizzati in tutto il resto della biblioteca.

Header <utility> sinossi

 #include<initializer_list> 
     namespace std { 

Così, gli autori del documento ha visto initializer_list come un programma di utilità, e quindi dovrebbe essere incluso con l'intestazione <utility>. E quindi lo è.

Il documento non ha proposto alcuna modifica all'intestazione <iterator>, quindi non sono state apportate.