Por que os inicializadores em class só usam = ou {}?

Inicializadores em class (recurso C ++ 11) devem ser colocados entre chaves ou seguir um sinal =. Eles não podem ser especificados dentro de parênteses.

Qual é a razão para isto?

    Eu não sou 100% positivo sobre isso, mas isso pode ser para evitar uma ambiguidade de syntax. Por exemplo, considere a seguinte class:

    class BadTimes { struct Overloaded; int Overloaded; // Legal, but a very strange idea. int confusing(Overloaded); // < -- This line }; 

    O que significa a linha indicada? Conforme escrito, esta é uma declaração de uma function de membro denominada confusing que aceita como parâmetro um object do tipo Overloaded (cujo nome não é especificado na declaração da function) e retorna um int . Se o C ++ 11 permitisse que os inicializadores usassem parênteses, isso seria ambíguo, porque também poderia ser uma definição de um membro do tipo int chamado de confusing que é inicializado com o valor do membro de dados Overloaded . (Isso está relacionado ao problema atual com o mais irritante Parse .)

    Ao exigir chaves, essa ambiguidade é removida:

     class BadTimes { struct Overloaded; int Overloaded; // Legal, but a very strange idea. int confusing{Overloaded}; // < -- This line }; 

    Agora, está claro que confusing é na verdade um int inicializado com o valor de Overloaded , porque não há como lê-lo como uma declaração de function.

    Espero que isto ajude!