Это один из древних приколов С++. Из-за того, что в ядре языка были оставлены старые способы инициализации, появилась вот такая вот каша. Единых правил нет. Допускается как =, так и () или {}. Например:
class A {
public:
A(int x): value(x) { }
private:
int value;
};
и все три варианта могут работать:
A a1(0), a2{5}, a3 = 7;
Однако, есть тонкости. Например, перегрузка оператора = или конструкторы копирования. Да, это еще одна cpaнь господня, которая была введена для усложнения жизни погромистам :)
Например, пример для примера:
class A {
public:
A(int x): value(x) { }
/* конструктор копирования */
A(const A& other)
{
value = -other.value;
}
/* перегрузка оператора = */
A& operator =(const A& other)
{
value = -other.value;
return *this;
}
private:
int value;
};
и вот как можно например с этим примером:
A a1(10);
A a2 = a1;
A a3 = 7;
A a4{a1}, a5(a1);
A a6 = a2 = a3 = a1;