无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了,当使用内置类型的变量时,这种初始化形式有一个重要特点,如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器报错。
long double ld = 3.1415926536
int a{ ld }, b = { ld }; //错误:转换未执行,因为存在丢失信息的危险
int c(ld), d = ld; //正确:转换执行,且确实丢失了部分之
列表初始化返回值:
c++11规定函数可以返回花括号包围的值的列表,类似于其他返回结果,此处的列表也用来表示函数返回的临时量进行初始化,如果列表为空,临时量执行值初始化,否则,返回的值有函数的返回类型决定。如果函数返回的是内置类型,则花括号包围的列表最多包含一个值,而且该值所占空间不应该大于目标类型的空间。
vector<string> process()
{
//...
//expectd和actual是string对象
if (expected.empty())
return{}; //返回一个空vector对象
else if (expected == actual)
return{ "functionX","okay" }; //返回列表初始化的vector对象
else
return{ "functionX",expected,actual };
}
初始化动态分配对象的数组:
可以对数组中的元素进行值初始化,方法是在大小之后跟一对空括号,虽然我们用空括号对数组中元素进行值初始化但不能在括号中给出初始化器。
int* pia2 = new int[10](); //10个值初始化为0的int
//如果初始化器数目大于元素数目,则new表达式失败,不会分配任何内存
//10个int分别用列表中对应的初始化器初始化
int* pia3 = new int[10]{ 0,1,2,3,4,5,6,7,8,9 };
//10个string,前4个用给定的初始化器初始化,剩余的进行值初始化
string* psa3 = new string[10]{ "a","an","the",string(3,'x') };