C ++:使用花括号来防止在赋值期间缩小范围

时间:2016-04-19 11:18:10

标签: c++ c++11 uniform-initialization narrowing

我熟悉使用大括号/初始化列表来阻止初始化变量时缩小,但在分配值时使用它是一种好习惯一个变量呢?

例如

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

有没有理由不使用大括号进行分配?

1 个答案:

答案 0 :(得分: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! 

如果(缩小时)缩小问题,则可以避免花括号。