使用=初始化和使用{}初始化有什么区别?

时间:2016-03-30 14:50:33

标签: c++ c++11

您可以使用=初始化变量。例如:

int a = 1000;

C ++ 11引入了额外的符号{}。例如:

int a {1000};

根据编程:Bjarne Stroustrup的原则和实践:

  

C ++ 11引入了一个初始化表示法,它禁止缩小转换次数。

我想查看这个很酷的功能。我输入了两段代码:

#include "std_lib_facilities.h"     |     #include "std_lib_facilities.h" 
                                    |
int main()                          |     int main()
                                    |
{                                   |     {
    int x = 254;                    |         int x {254};
    char y = x;                     |         char y {x};
    int z = y;                      |         int z {y};
                                    |
    cout << "x = " << x << '\n'     |         cout << "x = " << x << '\n'
         << "y = " << y << '\n'     |              << "y = " << y << '\n'
         << "z = " << z << '\n';    |              << "z = " << z << '\n';
                                    |
}                                   |     }

左边的代码使用=,而右边的代码使用{}

但即使使用{}后,右侧的代码也会丢失一些信息。因此,两段代码的输出相同:

  

x = 254

     

y =■

     

z = -2

那么,用=初始化和用{}初始化之间的区别是什么?

编辑:我的问题可能是也可能不是重复。我只是一个初学者,我甚至不理解可能原始问题的代码。我不是判断。即使它是重复的,我也无法理解该问题的任何答案。我觉得这个问题应该被视为一个原始的问题,因为我会理解简单的语言,而不是那个问题答案的某些高级词语。

1 个答案:

答案 0 :(得分:7)

  

使用=初始化和使用{}进行初始化有什么区别?

一般来说,区别在于前者为copy initialization,后者为direct - list initialization。链接的在线参考详细描述了所有三种初始化形式。特别是,你已经引用了不同之处;列表初始化不能用于缩小转换。

  

但即使使用{}

,右侧的代码也会丢失一些信息

右侧的程序格式不正确。

如上所述,该标准不允许在列表初始化的上下文中缩小conversionsintchar是一个缩小的转化。

由于程序格式错误,标准不保证其行为,除了需要编译器发出诊断消息。例如,g ++ - 5.3.0会说:

warning: narrowing conversion of 'x' from 'int' to 'char' inside { } [-Wnarrowing]
  

请你详细说明&#34;形成错误的&#34;一部分?

标准说程序不能执行X.你的程序执行X.因此它违反了使程序格式错误的标准。这里,X是:

  

如果需要缩小转换(见下文)来转换任何参数,程序就会格式不正确。

左边的程序并不是格式错误。然而,就像右侧的程序一样,确实为char y分配了char类型无法表示的值(在char是{{1}}的某些实现中,它可以表示无符号类型,但给定输出,看起来不是你的实现的情况)。当不可表示的值转换为有符号的类型时,结果值是实现定义的。

相关问题