关于C++中数组初始化后无法使用初始化式赋值的疑问
关于C++数组无法整体赋值的疑问解答
嘿,我来给你掰扯清楚Stroustrup在《C++程序设计语言》(TCPPPL)里说的这句话到底啥意思~
首先看你提到的数组初始化代码:
char v4[3]={'a', 'b', 0};
这是数组初始化操作——在数组创建的同时,用大括号列表给它的元素逐一赋值,这是C++完全允许的,编译器会把这些值依次填充到数组对应的内存位置中。
而书中说的“没有与初始化匹配的数组赋值方式”,核心含义就是:数组完成初始化之后,你没法再用这种大括号列表的形式对数组进行整体赋值。就像你贴的报错代码:
void f() { v4={'c','d',0}; //error: no array assignment }
这里试图把大括号里的整个值列表直接赋值给已经存在的数组v4,但C++的原生数组类型并不支持这种操作。原因是在赋值语境下,数组名会被隐式转换成指向数组第一个元素的指针,而你不能把一个初始化列表直接赋值给指针,所以编译器会抛出“no array assignment”的错误。
如果想要给已初始化的数组重新设置所有元素的值,你得换种方式:
- 逐个元素赋值:
v4[0]='c'; v4[1]='d'; v4[2]=0; - 用标准库函数批量复制,比如
std::copy - 或者改用C++11引入的
std::array容器,它支持这种直观的整体赋值操作,比如:std::array<char, 3> v4 = {'a', 'b', 0}; v4 = {'c', 'd', 0}; // 完全合法
内容的提问来源于stack exchange,提问作者Ashutosh Tiwari
相关产品推荐
相关产品推荐

