假设我有这段代码:
int i = 2;
int &ref = i++;
现在,我明白参考不能用rvalue初始化,
但是我无法理解为什么ref
没有使用左值初始化,这意味着i
,然后i
递增。
此外,在以下情况中:
int i = 2;
const int &ref = i++;
cout << ref << endl;
将打印 2
,这意味着ref
在递增之前使用i
初始化,即使用lval初始化。
之后ref
递增,但ref
是常量。
有人可以解释一下我在这里缺少的东西吗?
答案 0 :(得分:3)
增加int
后不会产生左值。假设的实现可能如下所示:
int operator++(int& i) {
int temp = i;
++i;
return temp;
}
如您所见,需要制作副本并按值返回。
预增量会导致左值,因为不需要复制,因此结果是对原始值的引用。
你的第二个例子是有效的,因为rvalues可以绑定到const-references。
答案 1 :(得分:1)
i++
不会返回i
,而是一个临时副本,它是在我增加之前拍摄的。
这就是为什么它被称为POST增量,因为它在保留当前状态的副本之后递增了变量。