所以我正在尝试一些数组,但我不明白为什么这不起作用。
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
为什么我不能这样做?错误是什么意思?
由于 C++ 与 C 的向后兼容性,数组具有各种丑陋的行为。其中之一是数组不可分配。请改用
std::array
或 std::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] = {};
你不能在 C++ 中给数组赋值,这很愚蠢,但这是事实。您必须将数组元素一一复制。或者您可以使用内置函数,例如
memcpy
或 std::copy
。
或者您可以放弃数组,而使用
std::vector
代替。他们可以被分配。
数组名称是不可修改的常量左值,您无法修改它。
values = numbers;
// ^
// is array name
读取编译器错误消息:
"error C2106: '=' : left operand must be l-value"
左值可修改可以出现在=
的lhs处。
您可以将数组名称分配给指针,例如:
int* ptr = numbers;
注意:数组名称是常量,但您可以修改其内容,例如
value[i] = number[i]
是 0 <= i < 5
的有效表达式。
为什么我不能那样做?
基本上这个限制是由语言强加的,内部数组名称用作基地址,通过基地址索引,您可以访问为数组分配的连续内存的内容。因此,在 C/C++ 数组名称中,be 出现在 lhs 处,而不是左值。
值=数字; 因为数字和值都是指针。
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];
}
std::array
是个好主意,但这也是可能的:
struct arr { int values[5]; };
struct arr a{{1, 2, 3}};
struct arr b{{}};
a = b;
否则,请使用
std::memcpy
或 std::copy
。
我认为不可分配性的原因是 C 希望确保指向数组中任何元素的任何指针几乎始终保持有效。
考虑允许动态调整大小的向量:在自动调整大小后,旧指针变得无效(可怕)。
PS。根据矢量的设计理念,以下块效果很好。
vector<int> v = {1, 5, 16, 8};
vector<int> v_2 = {7, 5, 16, 8};
v_2 = v;