Tengo curiosidad acerca de algunas de las nuevas características de C++ 0x. En particular, range-based for loops y initializer lists. Ambas funciones requieren una clase definida por el usuario para funcionar correctamente.C++ 0x, ganchos del compilador e idiomas codificados características
Me encontré con this post, y aunque la respuesta principal fue útil. No sé si es completamente correcto (Probablemente estoy completamente equivocado, vea el 3er comentario en la primera respuesta). De acuerdo con la current specifications para las listas de inicializador, la cabecera 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
};
Esto se puede ver en las especificaciones, simplemente Ctrl + F 'clase initializer_list'.
Para que = {1,2,3}
a ser moldeado de manera implícita en la clase initializer_list
, el compilador tiene que tener un cierto conocimiento de la relación entre {}
y initializer_list
. No hay ningún constructor que reciba nada, por lo que la initializer_list hasta donde puedo decir es un contenedor que se vincula con lo que el compilador realmente está generando.
Es lo mismo con el bucle for(:)
, que también requiere un tipo definido por el usuario para trabajar (aunque de acuerdo a las características, actualizados al no requiere ningún código para matrices y listas de inicializador. Pero las listas de inicializador requiere <initializer_list>
, así que es una requisito de código definido por el usuario por proxy).
¿Estoy entendiendo completamente cómo funciona esto aquí? No me equivoco al pensar que estas nuevas características realmente dependen en gran medida del código de usuario. Se siente como si las funciones estuvieran medio cocidas, y en lugar de compilar toda la función en el compilador, está a medio hacer por el compilador y medio hecho en includes. ¿Cuál es el motivo de esto?
Edit: Escribí "confío mucho en el código del compilador", y no "confío mucho en el código de usuario". Lo cual creo que eliminó por completo mi pregunta. Mi confusión no se trata de nuevas características integradas en el compilador, sino de elementos integrados en el compilador que se basan en el código de usuario.
Entiendo el requisito para el constructo for (:), sin el compilador que requiere una iteración diferente del contenedor sería imposible. Pero el for (:) no exige que un tipo funcione, solo si tiene la intención de ampliarlo. Lo cual para mí es similar al nuevo mecanismo de sobrecarga de ubicación. Sin embargo, todavía no veo el motivo de la lista initializer_type. = {1,2,3,4,5} a una matriz literal, pasada a un operador vacío {} (int arr [], 5); parece más limpio y no requiere sistemas de inclusión. Si el usuario quiere ponerlo en un contenedor, puede hacerlo en esa función. – Dave
Al igual que mencionó va_args, las funciones y macros se basan en una característica de compilación. No obtendrá un error de compilación por no incluir va_args, podría escribir el suyo. Del mismo modo, C++ 0x []() {} lambdas no requieren std :: function, de nuevo podrías escribir el tuyo propio. {}, por otro lado, exige la existencia de un nombre de clase específico, que se bloqueará si no existe. Y no debería ser forzado, supongo que estoy simplemente 'nerd furioso', pero mucho de lo que estoy viendo en el estándar C++ 0x parece cada vez más extraño por minuto. – Dave
Es un poco más complicado que eso. El compilador y los implementadores de STL no necesitan ser lo mismo. Microsoft usa la implementación Dinkunware STL, pero puede usar STLPort o cualquier otro. Las clases de STL no están definidas y definidas al 100%, y un implementador de STL puede decidir agregar nuevos parámetros de plantilla siempre que tengan un valor predeterminado y puedan usarse en el código de usuario que depende y usa solo los que están en el estándar. Esto significa que el compilador realmente no puede hacer coincidir fácilmente los contenedores STL. –