我对左值和右值有一些了解。因此,据我所知,我们不能分配给右值,但是非常量左值是可以的。
#include <iostream>
#include <vector>
int main(){
std::vector<int> v{ 1, 2, 3, 4, 5 };
v.begin() = v.end() - 2;
std::cout << *v.begin() << std::endl; // 1
for (auto const& e : v)
std::cout << e << ", ";// 1, 2, 3, 4, 5,
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以分配给begin()元素,但对元素却什么也没做?
Bri*_*ian 17
v.begin()是一个迭代器。分配给迭代器不会分配给迭代器指向的值。另外,由于v.begin()是prvalue,分配给您的对象在行的末尾被销毁,而不会影响v它所拥有的“永久”存储器。
如果v.begin()是原始指针,则编译器将在尝试分配给右值时发出错误。但是,该类型std::vector<T>::iterator通常是一个类类型,并且在您的实现中似乎是这种情况(带有正在使用的一组特定的编译器标志),因此将其分配给该类类型的v.begin()调用operator=。但这并不会改变迭代器对象是一个临时对象的事实,并且为其分配任何对象都不会产生进一步的影响。
为了分配给指向的元素v.begin(),您需要取消引用:*v.begin() = *(v.end() - 2)
分配给std :: vector :: begin()的结果是什么?
赋值表达式的结果(在您的示例中结果被舍弃)是赋值。在这种情况下,结果与相同v.end() - 2。
请注意,由于begin()返回值,因此此分配仅修改返回的临时对象。分配不会以任何方式修改向量。考虑到临时对象被丢弃,在实践中该分配没有可观察到的效果。
此外,如果标准库选择实现std::vector::iterator为指针,则此分配的格式可能不正确。
为什么我可以分配给
begin()
因为
但这对元素没有任何作用?
因为分配迭代器不会修改迭代器指向的元素。而是,分配更改迭代器指向的对象。
因此,据我所知,我们无法分配给右值
通常这是不正确的。特别是,对于类类型†并非如此。
†除非该类的赋值运算符具有左值引用限定符(并且没有右值引用限定的重载),否则这是非常规的。