This is a topic that can span an entire book chapter. See a quote from this recent draft Item by Scott Meyers of his upcoming Effective Modern C++ (reformatted for clarity):
Most developers end up choosing one kind of delimiter as a default, using the other only when they have to.
Braces-by-default folks are attracted by their wide applicability, their prevention of narrowing conversions, and their avoidance of C++’s most vexing parse. Such folks understand that in some cases (e.g., creation of a
std::vector
with a given size and initial element value), parentheses are required.In contrast, the go-parentheses-go crowd embraces parentheses as their default argument delimiter. They’re attracted to its consistency with the C++98 syntactic tradition, its avoidance of the auto-deduced-a-
std::initializer_list
problem, and the knowledge that their object creation calls won’t be inadvertently waylaid bystd::initializer_list
constructors. They concede that sometimes only braces will do (e.g., when creating a container with particular values).Neither approach is rigorously better than the other. My advice is to pick one and apply it consistently.