Vantagens da inicialização por lista (chaves) em C++11 e posteriores
Olá a todos! Comecei a estudar C++11 e me deparei com um novo recurso — inicialização usando chaves (list initialization). Por exemplo:
```cpp
std::vector v = {1, 2, 3};
int x{0};
```
Parece que tudo funciona, mas não entendo por que isso é necessário, quando existe a boa e velha inicialização com parênteses ou operador de atribuição. Parece-me apenas açúcar sintático.
Mas ouvi dizer que as chaves resolvem alguns problemas. Por exemplo, li que elas previnem conversões de estreitamento (narrowing conversions). Mas o que é isso? E quais são outras vantagens?
Tenho um exemplo específico que me confunde:
```cpp
int a = 3.14; // a == 3, apenas perde a parte fracionária
int b(3.14); // o mesmo
int c{3.14}; // Erro de compilação! Por quê?
```
Entendo que é um erro, mas por que gerá-lo? Talvez haja casos em que as chaves se comportam de forma inesperada? Por exemplo, com classes que têm um construtor de `std::initializer_list`. Me ajudem.