c ++ 11 — 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

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

9

Решение

Не проблема инициализации против присвоения.

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

Если вы попытаетесь инициализировать 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!

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]