2013-08-15 3 views
6

В C++11 это можно инициализировать struct с использованием равномерного инициализации, как показано ниже:Когда следует использовать единую инициализацию?

struct BasicStruct { 
    BasicStruct (int x, double y) : x_{x}, y_{y} {} 

private: 
    int x_; 
    double y_; 
}; 

BasicStruct var1{5, 3.2}; 

Вопросы:

  1. Когда я должен использовать этот синтаксис BasicStruct var1{5, 3.2} вместо вызова конструктора, как BasicStruct var1(5, 3.2)?

  2. Когда следует инициализировать атрибут, например x_{x}, вместо старого способа x_(x)?

+2

Нет, это «почему», и это «когда». Серьезно люди. – Potatoswatter

+0

@Potatoswatter http://stackoverflow.com/questions/1863784/uniform-initialization-in-c0x-when-to-use-instead-of?rq=1 и т. Д. – Rapptz

+0

@Rapptz ОК, теперь найдите один с ответами, которые делают смысл или лучше, чем тот, который я добавил здесь :) – Potatoswatter

ответ

4

Использование списка инициализация, когда список является общим, и вы могли бы заменить другой контейнер, например, массив, агрегате или 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, и его обычно следует избегать.

Терминология «равномерная инициализация» немного оптимистична, и она не отображается в стандарте. Это не подходит для всех случаев. Скобки обычно указывают списки, поэтому их правильно называют инициализацией списка. И именно тогда его следует использовать.

Смежные вопросы