Я знаком с использованием фигурных скобок / списков инициализаторов, чтобы предотвратить сужение, когда инициализация переменная, но целесообразно ли использовать ее, когда назначение значение переменной тоже?
Например,
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
Есть ли причина не использовать фигурные скобки для назначения?
Не проблема инициализации против присвоения.
Это проблема разных типов.
Если вы попытаетесь инициализировать 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!
Если (когда) сужение не является проблемой, вы можете избежать фигурных скобок.
Других решений пока нет …