Avatar ·

Ventajas de la inicialización con listas (llaves) en C++11 y posteriores

¡Hola a todos! Empecé a estudiar C++11 y me topé con una nueva característica: la inicialización con llaves (list initialization). Por ejemplo: ```cpp std::vector v = {1, 2, 3}; int x{0}; ``` Parece que todo funciona, pero no entiendo para qué sirve esto cuando ya existe la vieja y confiable inicialización con paréntesis o el operador de asignación. Me parece que es solo azúcar sintáctico. Pero he oído que las llaves resuelven algunos problemas. Por ejemplo, leí que previenen conversiones restrictivas (narrowing conversions). Pero ¿qué es eso? ¿Y cuáles son otras ventajas? Tengo un ejemplo concreto que me confunde: ```cpp int a = 3.14; // a == 3, simplemente se pierde la parte fraccionaria int b(3.14); // lo mismo int c{3.14}; // ¡Error de compilación! ¿Por qué? ``` Entiendo que es un error, pero ¿para qué provocarlo? ¿Quizás hay casos donde las llaves se comportan de manera inesperada? Por ejemplo, con clases que tienen un constructor de `std::initializer_list`. Aconséjenme.