自2011年C++标准修订版以来,变量可以通过下面给出的三种不同方式进行初始化。
int i = 0;
int i (0);
int i {0};
据我所知,所有三种不同的初始化都具有相同的效果。 如果它们都有相同的效果,为什么不像第一种那样坚持一种初始化方式呢? 在()或{}中包围变量的初始值,是否有任何特殊的需要来初始化变量?
不允许这三者中的任何一个的原因是为了保持向后兼容性。
在生产中,有大量的代码是用这三种方法编写的。 如果要更改标准,则需要重写工作代码,这会导致成本和可能的bug。 由于C++委员会对向后兼容性非常认真,所以我们最终落得这样的局面。 它仍然比Python等其他语言好得多,在Python中,从一个次要版本到另一个次要版本,您需要重写代码来格式化字符串,或者从0循环到10。
如果您可以选择,请选择{0}
,它称为统一初始化,原因是:-)
这是一个历史问题。 第一个是int i=0;
。 这个是70年代早期的C语言。 接下来,第一个C++版本引入了一个类似于初始化语法的函数,在这里写int i(0);
。 但是由于最令人烦恼的解析歧义,花括号初始化被发明了。
出于兼容性的原因,所有那些语法仍然有效。。。
int i = 0;
int i (0); //For backward compatibility
int i {0}; //Initializer list way
这3种类型的初始化是不同的。
int i = 2.2;
int i (2.2);
int i {2.2};
首先,two将执行隐式转换,但int i{0};
将为参数缩小提供错误/警告。
有关初始值列表的详细信息,请查看此视频。