Про переваги використання ініціалізації списку вже є чудові відповіді, однак моє особисте правило - НЕ використовувати фігурні дужки, коли це можливо, а замість цього зробити залежним від понятійного значення:
- Якщо об'єкт, який я створюю концептуально, містить значення, які я передаю в конструкторі (наприклад, контейнери, структури POD, атома, розумні покажчики тощо), то я використовую дужки.
- Якщо конструктор нагадує звичайний виклик функції (він виконує деякі більш-менш складні операції, параметризовані аргументами), то я використовую синтаксис виклику звичайної функції.
- Для ініціалізації за замовчуванням я завжди використовую фігурні дужки.
З одного боку, таким чином я завжди впевнений, що об'єкт ініціалізується незалежно від того, наприклад, це "реальний" клас із конструктором за замовчуванням, який би називався так чи інакше або вбудованим / POD-типом. По-друге, це - у більшості випадків - відповідає першому правилу, оскільки ініціалізований за замовчуванням об'єкт часто представляє "порожній" об'єкт.
На мій досвід, цей набір правил можна застосовувати набагато послідовніше, ніж використання фігурних дужок за замовчуванням, але потрібно чітко пам’ятати всі винятки, коли вони не можуть бути використані або мають інше значення, ніж «нормальний» синтаксис виклику функцій із дужками (викликає різну перевантаження).
Наприклад, вона добре поєднується зі стандартними типами бібліотек, як std::vector
:
vector<int> a{10,20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10,20); //Parentheses -> uses arguments to parametrize some functionality,
vector<int> c(it1,it2); //like filling the vector with 10 integers or copying a range.
vector<int> d{}; //empty braces -> default constructs vector, which is equivalent
//to a vector that is filled with zero elements
auto
?