¿Cómo usar la sintaxis de inicialización uniforme de C ++ 11?

No puedo entender cuándo y cómo usar la nueva sintaxis de inicialización uniforme en C ++ 11.
Por ejemplo, obtengo esto:

std::string a{"hello world"}; // OK
std::string b{a};  // NOT OK

¿Por qué no funciona en el segundo caso? El error es:

error: no matching function for call to ‘std::basic_string<char>::basic_string(<brace enclosed initializer list>)’    

con esta versión de g ++g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2.

Y con datos primitivos, ¿qué sintaxis debo usar?

int i = 5;
int i{5};
int i = {5};

Respuestas a la pregunta(3)

Su respuesta a la pregunta