2012-01-18 16 views
10

El último estándar de C++ 11 incluye disposiciones para el rango para "simplemente trabajar" para arreglos nativos sin tener que incluir <iterator> o cualquier otro encabezado. Esto fue tratado por primera vez, por lo que yo puedo decir, en papel n2900 de trabajo como resultado de los comentarios Reino Unido 78 y 79.#include <initializer_list> requerido para usar la lista de inicializadores en el rango para?

Esta propuesta también incluye una disposición que implícitamente #include <initializer_list> en cada unidad de traducción, de manera que, por ejemplo, el programa

#include <iostream> 

int main() 
{ 
    for (auto i : { 1, 2, 3, 4, 5 }) 
     std::cout << i << "\n"; 
} 

sería estándar conformes aun sin incluir <initializer_list>.

Sin embargo, cuando se eliminaron los conceptos de C++ 11, se revisó el rango para el visto en n2930. Si bien la provisión para arreglos para "solo funcionan" permanece, no hay mención de que lo mismo sea cierto para las listas de inicializadores; de hecho, la especificación de que varios encabezados de contenedor de biblioteca estándar serán #include <initializer_list> y el texto final de 8.5.4.2 implica lo contrario para mí.

Por lo que puedo decir, esto es muy similar a la redacción final sobre el tema. Entonces, ¿el programa anterior está bien formado con respecto al estándar final, o necesito #include <initializer_list> incluso para usarlo en un rango? Dicho de otra forma, ¿el uso de una lista de inicializadores basada en un rango constituye un "uso de std::initializer_list --- incluso un uso implícito en el que el tipo no se nombra" según 8.5.4.2 del FDIS?

+2

Bastante seguro que es un "sí". ¿Qué más podría iterar en tu ciclo si no fuera una lista de inicializadores? –

Respuesta

6

Yo diría que sí. Según §6.5.4 [stmt.ranged]/1, la declaración

for (auto i : { 1, 2, 3, 4, 5 }) 
    ... 

es sólo equivalente a

auto&& __range = { 1, 2, 3, 4, 5 }; 
... 

y eso significa que se utiliza un initializer_list<int>, y la cabecera <initializer_list> necesita ser incluido .

+0

Esa era mi sospecha, pero parece de alguna manera poco intuitiva. Me recuerda que para C++ 03 cada libro de texto usaría 'std :: endl' pero solo incluiría' 'y no' iomanip'. –

Cuestiones relacionadas