X t1 = v; // copy initialization possibly copy construction
X t2(v); // direct initialization
X t3 = { v }; //initialize using initializer list
X t4 = X(v); // make an X from v and copy it to t4
I would say that each above example has it's own purpose.
Say you need to make sure a copy constructor is called?
Or say you want to avoid using a copy constructor all together?
What if you want to assign more than one value to an array?
What if you want to initialize a value generated during run-time but need to compute data first?