C++:使用大括号防止赋值时变窄

标签 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

是否有理由不使用大括号进行赋值?

最佳答案

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

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

如果您尝试用 double 初始化一个 int 变量,您会得到同样的错误。

并且您可以将 {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! 

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

关于C++:使用大括号防止赋值时变窄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716820/

相关文章:

c++ - 当 T 是指针类型时 const T 的含义?

c++ - 统一初始化以调用初始化程序列表以外的构造函数

c++ - openmp 循环结果归零

c++ - 使用 __stdcall 和 Boost 1.47.0 编译错误 log4cxx

C++ 重新定义变量,全局命名空间被污染,我不知道为什么

c++ - 在 C++11 中传递具有未指定参数的函数?

c++ - C++ 编程语言,定义与声明练习(简单,如果需要 XD 的帮助很乏味)

c++ - 错误 : no matching function for call to c++ enumeration

c++ - 尝试在声明中仅使用类名构造临时对象

c++ - 基本类型的统一初始化?