Использование списка инициализация, когда список является общим, и вы могли бы заменить другой контейнер, например, массив, агрегате или vector
, без особого изменения его значения.
// "triplet" may be a struct, an array, or a std::vector,
// but it has at least single-precision floating-point values.
triplet dimensions { 5, 1.2f, static_cast<float>(M_PI) };
Если вы создаете конкретный класс с аргументами для конкретного конструктора, более подходящими являются старомодные парсеры.
Одной из уникальных особенностей инициализации с рамно-Init-список является то, что она не позволяет преобразования сужение, которые могут привести к числовые данные будут потеряны, например, дробная часть числа с плавающей точкой или старшие биты от long
. Это помогает отмечать (или предотвращать) ошибки, возникающие в результате замены, например, более узкий тип массива во время рефакторинга кода.
Аналогичным образом, в другом случае, когда x{ y }
является подходящим, это при выполнении цифрового преобразования, которое вы не потеряете. x(y)
будет очень стараться сделать преобразование, даже прибегая к reinterpret_cast
, и его обычно следует избегать.
Терминология «равномерная инициализация» немного оптимистична, и она не отображается в стандарте. Это не подходит для всех случаев. Скобки обычно указывают списки, поэтому их правильно называют инициализацией списка. И именно тогда его следует использовать.
Нет, это «почему», и это «когда». Серьезно люди. – Potatoswatter
@Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-of?rq=1 и т. Д. – Rapptz
@Rapptz ОК, теперь найдите один с ответами, которые делают смысл или лучше, чем тот, который я добавил здесь :) – Potatoswatter