2016-03-30 82 views
5

您可以使用=初始化一个变量。例如:用=初始化和用{}初始化有什么区别?

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

那么,什么是与=初始化之间的差并用{}初始化?

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

+0

您确切地认为,在正确的例子中,“缩小转换”会失败吗?在你的机器上初始化'char'的正数大于'CHAR_MAX'? – DevSolar

+1

'char'(在你的系统中)默认为'signed char'(但注意'signed char'!='char')。 '254'是一个有效的'char'(没有缩小转换,它的数值无关紧要),但是转换回为int,由于符号的原因你会得到它。要查看发生了什么变化,请尝试'unsigned char k = {260};'vs'unsigned char k = 260;' –

+0

如果使用'gcc'添加'-Werror = narrowing'命令行选项来取消缩小转换。 –

回答

7

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

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

但是,即使使用{}

程序右侧后在右侧的代码失去了一些信息是非法的构造。

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

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

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

愿你请的 “病态的” 部分详细点吗?

标准表示程序不应该执行X.你的程序执行X.因此它违反了使程序不合格的标准。这里,X是:

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


左边的程序是不是生病形成。然而,就像右边的程序一样,它确实为char y赋值了char类型所不能表示的值(在某些实现中,char是一个无符号类型,但在给定输出的情况下,是你的实现情况)。将不可表示的值转换为带符号的类型时,结果值是实现定义的。

+0

是的,我得到了这个警告信息!请您详细说明“不健全”的部分?尽管谢谢你的回答! – Superex

+0

@Superex我添加了一个不合格的简单解释。 – user2079303

+0

感谢您对该部分的阐述。但是我已经使用了本书建议的库(std_lib_facilities.h)。所以我怀疑这个计划可能是不合格的。 – Superex

相关问题