Comportamiento de la lista de inicializadores: diferencias en std::vector y std::array
Mientras std::vector y std::array son Ambos contenedores en C, su comportamiento con las listas de inicializadores difiere. En este artículo, exploraremos las complejidades de la inicialización agregada y comprenderemos por qué se requieren llaves dobles para std::array.
Considere el siguiente fragmento de código que inicializa un std::vector y un std:: matriz:
std::vectorx{1,2,3,4}; std::array y{{1,2,3,4}};
std::Inicialización de vector
std::vector admite constructores definidos por el usuario, incluidos aquellos que aceptan std::initializer_list. Por lo tanto, podemos inicializar x directamente usando llaves sin necesidad de llaves adicionales.
std::array Inicialización
A diferencia de std::vector, std::array es un agregado que no tiene constructores definidos por el usuario. En cambio, se basa en la inicialización agregada, una característica heredada de C.
En la inicialización agregada de "estilo antiguo", se utilizan el signo igual y dos puntos:
std::arrayy = { { 1, 2, 3, 4 } };
Sin embargo, cuando se utiliza la inicialización directa de lista (introducida en C 11), esta = sintaxis ya no es válida. Además, la elisión de llaves, que permite omitir llaves adicionales, solo se permite en declaraciones con la sintaxis antigua estilo =. Para la inicialización directa de la lista, son obligatorias llaves adicionales.
Defecto de CWG
Un informe de defecto de CWG (defecto de CWG #1270) tiene como objetivo resolver esta restricción permitiendo la elisión de llaves para otras formas de inicialización de listas. Si se adopta, el siguiente código estaría bien formado:
std::arrayy{ 1, 2, 3, 4 };
En conclusión, la diferencia en El comportamiento entre std::vector y std::array con listas de inicializadores se debe a sus características fundamentales como una clase con constructores definidos por el usuario y un agregado que depende de la inicialización agregada, respectivamente. Se requieren llaves dobles para que std::array se ajuste a las reglas de inicialización agregada, mientras que std::vector permite la inicialización directa usando un único conjunto de llaves sin depender de la sintaxis de inicialización agregada de estilo antiguo.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3