C++数组:需要左值作为赋值运算符的左操作数

3

错误: 要求L值作为赋值运算符的左操作数(第4行)

请帮助我理解,我哪里出了错以及为什么会发生这个错误?

int *x = nullptr;
x = (int*) realloc(x, 10);
for (int i = 0; i < 10; ++i) {
    (x + i) = new int(i + 3);
}

什么是一个变量? - Tom
抱歉,打错了。应该是 x。 - Ivan
2
x has type int*, so x+i also has type int*. Type-wise, your code checks out. However, it does not make sense semantically: x+i is the address of some int, and you are trying to assign a new address (int*) to it. The correct syntax is *(x + i) = i+3 or x[i] = i+3 - Botje
1
@YesThatIsMyName 这取决于 x 实际上是什么。 - πάντα ῥεῖ
2
这与 int x = 0; int i = 1; (x + i) = 3; 相同的情况,你不应该期望它能够工作。(关于指针最重要的一点是,指针本身并没有什么特别之处。) - molbdnilo
2个回答

5
(x + i) = new int(i + 3);

应该是

*(x + i) = i + 3;

(x + i)会产生一个指针rvalue (const int*),不能被赋值,但可以通过合法的解引用*(x + i)


通常情况下,你应该避免在c++代码中手动管理内存(尤其是不使用realloc())。

你可以按照以下方式重写你的c++代码片段:

std::vector<int> x(10);
int i = 0;
for (auto& elem : x) {
    elem = i + 3;
    ++i;
}

非常感谢!我现在明白了! - Ivan

3
指针算术在此处不产生左值。因此,您不能这样做:
(x + i) = new int(i + 3);

您可能想表达的是这个意思:
*(x + i) = i + 3;

好的,为什么指针算术运算不产生lvalue?只有在使用new()时才会产生吗?还是说指针算术运算总是产生rvalue? - Ivan
1
@Ivan 指针算术 不会产生左值指针,但是可以通过对指针进行解引用来获取左值引用,就像我在我的答案中所解释的那样。 - πάντα ῥεῖ
1
@Ivan:这里指针算术的结果是一个地址,它不能被赋值给另一个地址。这就像写作:123 = 456; - P.W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接