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

Jam*_*mes 9 c++ narrowing uniform-initialization c++11

我熟悉使用花括号/初始化列表来防止在初始化变量时缩小,但是在为变量赋值时使用它是一种好习惯吗?

例如

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
Run Code Online (Sandbox Code Playgroud)

是否有理由不使用花括号进行分配?

max*_*x66 4

不是初始化与赋值的问题。

这是一个不同类型的问题。

如果您尝试使用inta 初始化变量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;
 }
Run Code Online (Sandbox Code Playgroud)

你的例子,丰富了。

分配值时的一个好习惯?如果您想确保不失去精度,则可以。

例子:可以assign()这样写一个模板函数

template <typename X, typename Y>
void assign (X & x, Y const & y)
 { x = {y}; }
Run Code Online (Sandbox Code Playgroud)

所以你一定可以避免缩小范围

 // i is of type int
 assign(i, 23);    // OK
 assign(i, 11.2);  // ERROR! 
Run Code Online (Sandbox Code Playgroud)

如果(当)缩小不是问题时,您可以避免使用花括号。