【发布时间】:2017-02-06 07:16:05
【问题描述】:
假设我有一个向量 v{1, 2, 3, 4, 5}。我想削减最后两个元素,所以我想我会做类似的事情
v.end() = v.begin() + 3;
让我们来看看这个sn-p:
std::vector<int> v {1,2,3,4,5};
std::cout << *(v.end()-1) << std::endl;
v.end() = v.begin() + 3;
std::cout << *(v.end()-1) << std::endl;
这两种情况下都会打印 5。这是为什么?如果 vector::end 返回一个迭代器,它不是一个右值吗?如果是这样,代码根本不应该编译。如果是左值,为什么结束迭代器不指向元素v.begin() + 3?
【问题讨论】:
-
如果你想知道你是否可以赋值给一个右值,你应该使用一个不太容易混淆的例子。如果您想知道如何从向量中“剪切最后两个元素”,那么也许您可以删除右值的东西。这两个问题相互干扰,使问题变得不清楚。
-
好的,我会记住这一点的,谢谢
-
@juanchopanza:这句话并不完全公平。您必须假设有问题的人对问题没有完全理解,这毕竟是他们问的原因。如果您处于编写上述代码的 C++ 级别,那么期望您了解有关左值和右值的细节是不合理的。所以你可能会看到它失败了,然后开始推理会发生什么,最后得到上面的问题。考虑到它是真正的可编译代码,具有预期和实际结果,我会说它适合 StackOverflow。