为什么C++有不同的变量初始化方式?



自 2011 年修订C++标准以来,变量可以通过下面给出的三种不同方式进行初始化。

int i = 0;
int i (0);
int i {0};

据我所知,所有三种不同的初始化都具有相同的效果。如果它们都具有相同的效果,为什么不坚持像第一种一样的初始化方式呢?是否有任何特殊需要通过将变量的初始值括在 (( 或 {} 中来初始化变量?

不禁止这三者中的任何一个的原因是保持向后兼容性。

在生产中,有大量的代码是用这三种方式中的每一种编写的。如果要更改标准,则需要重写工作代码,从而导致成本和可能的错误。由于C++委员会非常认真地对待向后兼容性,我们最终会陷入这种情况。它仍然比Python等其他语言要好得多,在Python中,从次要版本到次要版本,您需要重写代码以格式化字符串,或者从零循环到十。

如果你有选择,选择{0},它被称为统一初始化是有原因的:-(

这是一个历史问题。第一个是int i=0;.这个来自 1970 年代的早期 C 语言。接下来的第一个C++版本引入了一个函数,如初始化语法,它写在这里int i(0);。但是由于最令人烦恼的解析歧义,发明了大括号初始化。

出于兼容性原因,所有这些语法仍然有效......

int i = 0;
int i (0); //For backward compatibility
int i {0}; //Uniform Initialization

这 3 种类型的初始化是有区别的。

int i = 2.2;
int i (2.2);
int i {2.2};

首先,两个将进行隐式转换,但int i {0};会为您提供参数缩小的错误/警告。

有关初始值设定项列表的详细信息,请查看此视频。

最新更新