One thing to keep in mind is that they are not always equivalent:
The most well-known example of this is probably the two-argument vector constructor (does Meyers mention this?):
1 2
std::vector<int> a{5, 10}; // two elements (5 and 10)
std::vector<int> b(5, 10); // five elements containing the value 10
The behavior differs because only the first form creates an initializer_list.
This can lead to unexpected behavior. One example is std::whatever::emplace_back(). Consider the structure std::vector<std::vector<int>> v;
What does this do? v.emplace_back(5, 10);
It turns out that the semantics actually depend on the allocator, which is unfortunate, but by default (i.e., when the allocator is std::allocator), the element is value-constructed (parentheses are used).