21

所以我在玩一些数组,我不知道为什么这不起作用。

int numbers[5] = {1, 2, 3};
int values[5] = {0, 0, 0, 0, 0};
values = numbers; 

出现以下错误:

Error   1   error C2106: '=' : left operand must be l-value c:\users\abc\documents\visual studio 2012\projects\consoleapplication7\consoleapplication7\main.cpp 9   1   ConsoleApplication7

为什么我不能那样做?错误是什么意思?

4

6 回答 6

33

由于 C++ 与 C 的向后兼容性,数组具有各种丑陋的行为。其中一种行为是数组不可赋值。使用std::arraystd::vector代替。

#include <array>
...
std::array<int,5> numbers = {1,2,3};
std::array<int,5> values = {};
values = numbers;

如果由于某种原因必须使用数组,则必须通过循环或使用循环的函数复制元素,例如std::copy

#include <algorithm>
...
int numbers[5] = {1, 2, 3};
int values[5] = {};
std::copy(numbers, numbers + 5, values);

附带说明一下,您可能已经注意到我初始化values数组的方式有所不同,只是提供了一个空的初始化程序列表。我依赖于标准中的一条规则,即如果您为聚合提供初始化列表,无论多么部分,所有未指定的元素都是值初始化的。对于整数类型,值初始化意味着初始化为零。所以这两个是完全等价的:

int values[5] = {0, 0, 0, 0, 0};
int values[5] = {};
于 2013-09-23T14:56:06.610 回答
8

您不能在 C++ 中分配数组,这很愚蠢,但确实如此。您必须一一复制数组元素。或者您可以使用内置函数,例如memcpyor std::copy

或者您可以放弃数组,而改用数组std::vector。他们可以被分配。

于 2013-09-23T14:55:39.250 回答
4

数组名称是常量不可修改的左值,你不能修改它。

values = numbers; 
// ^
// is array name

阅读编译器错误信息:"error C2106: '=' : left operand must be l-value"一个 l-value is modifiable 可以出现在=.

您可以将数组名称分配给指针,例如:

int* ptr = numbers;

注意:数组名称是常量,但您可以修改其内容,例如.value[i] = number[i]的有效表达式0 <= i < 5

为什么我不能那样做?

基本上这种约束是由语言强加的,内部数组名称用作基地址,并且通过使用基地址进行索引,您可以访问为数组分配的内容继续内存。因此,在 C/C++ 数组名称中,be 出现在 lhs 而不是左值。

于 2013-09-23T14:55:45.663 回答
0

std::array是个好主意,但这也是可能的:

struct arr { int values[5]; };

struct arr a{{1, 2, 3}};
struct arr b{{}};

a = b;

否则,使用std::memcpyor std::copy

于 2013-09-23T15:31:42.190 回答
0

值=数字;因为数字和值是指针。

int numbers[5] = {1, 2, 3};
int values[5] = {0, 0, 0, 0, 0};
for(int i = 0;i < 5; i ++){
    values[i] = numbers[i];
}
于 2013-09-23T15:18:35.747 回答
0

我认为不可分配性的原因是 C 希望确保指向数组中任何元素的任何指针几乎始终保持有效。

考虑允许动态调整大小的向量:旧指针在自动调整大小后变得无效(可怕地)。

PS。使用向量的设计理念,以下块运行良好。

vector<int> v = {1, 5, 16, 8};
vector<int> v_2 = {7, 5, 16, 8};
v_2 = v;
于 2019-10-14T02:34:13.830 回答