¿Por qué 'std :: vector <int> b {2};' crear un vector de 1 elemento y no uno de 2 elementos?

He estado jugando con C ++ 11 durante los últimos días, y se me ocurrió algo extraño.

Si quiero inicializar uniformemente un int:

int a{5};

Pero si le hago lo mismo a un std :: vector:

std::vector<int> b{2};

No construye una matriz de dos elementos, sino una matriz con un elemento de valor dos. Parece que para obtener ese efecto, uno debería ser más explícito al respecto:

std::vector<int> c{{2}};
std::vector<int> d = {2};

Pero no me gusta la declaración de b, esto parece inconsistente. He visto algunas otras cosas con el mismo efecto. Lo que pregunto: ¿es este comportamiento en el estándar final de C ++ 11, o es solo en un borrador que se implementó temprano? Si es así, ¿por qué el comité de normas incluyó este comportamiento? Parece que derrota todo el propósito de la inicialización uniforme, ya que uno tiene que recordar qué clases tienen constructores de lista de inicializadores y usar la sintaxis old () en lugar de {} con solo esas clases. O uno renuncia por completo a la inicialización uniforme.

Esto parece una gran "trampa". Pero puede haber ventajas que no conozco.

Edit: este código:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a{2};
    for (auto x: a) {
        std::cout << x << std::endl;
    }
    return 0;
}

salidas "2" en gcc 4.6.2

Respuestas a la pregunta(6)

Su respuesta a la pregunta