Pregunta

Estoy un poco de curiosidad acerca de algunas de las nuevas características de C++0x.En particular gama basada en bucles for y inicializador de las listas de.Ambas funciones requieren una clase definida por el usuario con el fin de funcionar correctamente.

Me he topado con este post, y mientras que la parte superior de respuesta fue de gran ayuda.No sé si es del todo correcto (Seguramente me estoy completamente malentendido, ver el 3er comentario en la primera respuesta).De acuerdo a la especificaciones actuales de los para inicializador de las listas, el encabezado define un tipo:

template<class E> class initializer_list {
public:
    initializer_list();

    size_t size() const; // number of elements
    const E* begin() const; // first element
    const E* end() const; // one past the last element
};

Usted puede ver esto en las especificaciones, solo Ctrl + F la clase de los initializer_list'.

En orden para = {1,2,3} implícitamente empotrado en el initializer_list la clase, el compilador TIENE que tener algún conocimiento de la relación entre {} y initializer_list.No hay ningún constructor que recibe nada, así que el initializer_list como lo que puedo decir que es un contenedor que se presenta vinculado a lo que el compilador está generando.

Es el mismo con el for( : ) lazo, que también requiere de un tipo definido por el usuario para trabajar (a pesar de que según las especificaciones, actualizados para que no requieren ningún tipo de código para las matrices y el inicializador de las listas.Pero inicializador de listas requieren <initializer_list>, por tanto es un código definido por el usuario requisito por proxy).

Estoy malentendido completamente cómo funciona esto aquí?Yo no estoy equivocado en pensar que estas nuevas características hacen de hecho, dependen muy fuertemente de código de usuario.Se siente como si las características son la mitad del horno, y en lugar de construir la totalidad de la función en el compilador, que es la mitad de-hecho por el compilador y a medio hacer en incluye.¿Cuál es la razón para esto?

Editar: He escrito 'se basan en gran medida en el compilador de código', y no 'se basan en gran medida en el código de usuario'.Que creo que completamente se quitó de encima a mi pregunta.Mi confusión no es acerca de las nuevas características de ser integrada en el compilador, se trata de cosas que están integradas en el compilador que se basan en el código de usuario.

¿Fue útil?

Solución

Yo no estoy equivocado en pensar que estas nuevas características hacen de hecho, dependen muy fuertemente en el compilador de código

Ellos confían extremadamente en el compilador.Si necesita incluir un encabezado o no, el hecho es que, en ambos casos, la sintaxis sería un error de análisis con el día de hoy compiladores.El for (:) no acaba de encajar en el hoy de los estándar, donde el único permitido construir es for(;;)

Se siente como si las características son la mitad del horno, y en lugar de construir la totalidad de la función en el compilador, que es la mitad de-hecho por el compilador y a medio hacer en incluye.¿Cuál es la razón para esto?

El apoyo debe ser implementado en el compilador, pero se requiere incluir un sistema de cabecera para que funcione.Esto puede servir para un par de propósitos, en el caso de la inicialización de las listas, el tipo (interfaz para el compilador de apoyo) en el ámbito para el usuario, de modo que usted puede tener una manera de usarlo (pensar cómo va_args están en C).En el caso de la gama basada por (lo cual es simplemente azúcar sintáctico) que usted necesita para llevar Gama en el ámbito de modo que el compilador puede realizar su magia.Tenga en cuenta que el estándar define for ( for-range-declaration : expression ) statement como equivalente a ([6.5.4]/1 en el proyecto):

{ 
   auto && __range = ( expression ); 
   for ( auto __begin = std::Range<_RangeT>::begin(__range), 
         __end = std::Range<_RangeT>::end(__range); 
         __begin != __end; 
         ++__begin ) { 
      for-range-declaration = *__begin; 
      statement 
   } 
} 

Si desea utilizar sólo en las matrices y contenedores STL que podrían ser implementadas sin la Range concepto (no en C++0x sentido), pero si desea ampliar la sintaxis en clases definidas por el usuario (sus propios contenedores), el compilador puede fácilmente dependen de la existente Range plantilla (con tus propias posible especialización).El mecanismo de dependiendo de la plantilla que se esté definido es equivalente a requerir una interfaz estática en el contenedor.

La mayoría de los otros idiomas han ido en la dirección de exigir una interfaz regular (es decir Contenedor,...) y el uso de polimorfismo de tiempo de ejecución en que.Si que se iba a hacer en C++, el conjunto de la STL, tendría que ir a través de una reestructuración importante como contenedores STL no comparten una base común o de la interfaz, y no están preparados para ser utilizados polimorphically.

Si cualquier, la norma actual no será underbaked por el tiempo que se va fuera.

Otros consejos

Es sólo la sintaxis de azúcar.El compilador va a ampliar el dado sintáctica de las construcciones en su equivalente en C++ expresiones que hacen referencia a los tipos estándar / los nombres de los símbolos directamente.

Este no es el único acoplamiento fuerte que los modernos compiladores de C++ tienen entre su lengua y el "mundo exterior".Por ejemplo, extern "C" es un poco de un idioma hack para dar cabida a C enlaces de modelo.Lenguaje orientado a formas de declarar el almacenamiento local de subprocesos implícitamente dependen mucho de la RTL trucos para trabajar.

O mirar C.¿Cómo acceder a los argumentos pasados a través de ...?Usted necesita confiar en la biblioteca estándar;pero que utiliza la magia que tiene un muy duro dependencia de cómo exactamente el compilador de C establece los marcos de pila.

ACTUALIZACIÓN:

En todo caso, el enfoque de C++ se ha adoptado aquí es más en el espíritu de C++ que la alternativa - que sería añadir un intrínseca de la colección o el tipo de rango, al horno, en el lenguaje.En lugar de ello, es que se realiza a través de un proveedor definido por el tipo de rango.Yo realmente no lo veo como muy diferente a variadic argumentos, que son igualmente inútiles sin la definida por el proveedor de descriptor de acceso de las macros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top