2016-04-19 8 views
9

я знаком с использованием фигурных скобок/списков инициализатора, чтобы предотвратить сужение при инициализации переменных, но это хорошая практика, чтобы использовать его при назначения значения к переменная тоже?C++: фигурные скобки, чтобы предотвратить сужение при назначении

См., Например,

int i{1};  // initialize i to 1 
double d{2.0}; // initialize d to 2.0 
i = {2};  // assign value 2 to i 
i = {d};  // error: narrowing from double to int 

Есть ли причина не использовать фигурные скобки для назначения?

+5

если вы хотите сужение? – xaxxon

+0

Я бы сказал: не используйте их в присваиваниях – Exceptyon

+0

Прочитайте: https://herbsutter.com/2013/05/09/gotw-1-solution/ и, возможно, https://herbsutter.com/2013/ 08/12/gotw-94-решение-ааа-стиль-почти всегда-авто / –

ответ

2

Не проблема инициализации и назначения.

Это проблема разных типов.

Если вы попытаетесь инициализировать переменную int с помощью double, вы получите ту же ошибку.

И вы можете присвоить {d} другой переменной double.

int main() 
{ 
    int i{1};  // initialize i to 1 
    //int i2{3.0}; // ERROR! 
    double d{2.0}; // initialize d to 2.0 
    double d2{1.0}; // initialize d2 to 1.0 
    i = {2};  // assign value 2 to i 
    //i = {d};  // error: narrowing from double to int 
    d2 = {d};  // OK 

    return 0; 
} 

Ваш пример, обогащенный.

Хорошая практика при присвоении значения? Может быть, если вы хотите быть уверены, что не потеряете точность.

Пример: Вы можете написать функцию шаблона assign() таким образом

template <typename X, typename Y> 
void assign (X & x, Y const & y) 
{ x = {y}; } 

Таким образом, вы уверены, чтобы избежать сужения

// i is of type int 
assign(i, 23); // OK 
assign(i, 11.2); // ERROR! 

Если (когда) Сужение не является проблемой, вы может избежать фигурных скобок.