Уже есть отличные ответы о преимуществах использования инициализации списка, однако мое личное правило - НЕ использовать фигурные скобки всякий раз, когда это возможно, а вместо этого ставить его в зависимость от концептуального значения:
- Если объект, который я создаю концептуально, содержит значения, которые я передаю в конструкторе (например, контейнеры, структуры 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
?