在C ++中初始化后的数组赋值

时间:2018-05-22 15:08:03

标签: c++ arrays

我正在阅读Stroustrup撰写的TCPPPL。在“数组”主题中,我发现了这个:

char v4[3]={'a', 'b', 0};

然后它提到“没有匹配初始化的数组赋值”,即。以下是错误:

void f()
{
v4={'c','d',0}; //error: no array assignment
}

作者的意思是什么?他是否意味着在初始化阵列后你无法重新分配它?

3 个答案:

答案 0 :(得分:4)

  

他是否意味着在初始化阵列后你无法重新分配它?

是。你不能改变阵列"一个数组包含。您可以更改数组中每个元素的值,但不能将数组分配给另一个数组。

int a[] = {1,2,3};
int b[] = {4,5,6};
b = a; // this is also illegal

这是使用std::stringstd::arraystd::vector等标准容器的一个原因。它们是可分配和可复制的(并且可移动)。

答案 1 :(得分:1)

  

作者的意思是什么?他是否意味着在初始化阵列后你无法重新分配它?

是的,这是正确的。虽然,您无法在初始化之前分配数组,因此应简化为:“您无法分配数组”。

答案 2 :(得分:0)

除了现有答案之外,还需要注意一件有趣的事情。 C++ 标准的第 11.4.5 条指出:

<块引用>

非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值......如果子对象是数组,则以适合于元素类型。”

所以下面的代码是绝对有效的。

struct { int c[3]; } s1, s2 = {3, 4, 5}; 
s1 = s2;