【发布时间】:2020-12-27 00:10:44
【问题描述】:
我似乎暂时无法解决这个特定问题。 例如,如果我有以下代码:
void foo(std::vector<int>::iterator &it) {
// ...
}
int main(){
std::vector<int> v{1,2,3};
foo(v.begin());
}
我会得到编译错误:
initial value of reference to non-const must be an lvalue.
我猜我会收到错误,因为a.begin() 返回一个右值。
如果是这样,下面的表达式怎么可能起作用:
v.begin()=v.begin()++;
如果v.begin() 是右值?
【问题讨论】:
-
在类类型的临时对象上调用非常量成员函数是合法的。如
v.begin().operator=(v.begin().operator++())。它有时很有用,但当这些成员函数是重载的运算符时,它确实会导致奇怪的代码编译。 -
如果他们没有指定迭代器应该禁止在标准中分配右值,这对我来说似乎是一个缺陷
-
foo应该按值获取迭代器。这就是迭代器的用途。传递对迭代器的引用是非常不寻常的。 -
@alterigel OP 关心为什么分配给右值会编译。它至少在 C++14 模式下在 gcc 上编译,所以它与讨厌的 MS 扩展无关
标签: c++