Posted on 2012-12-23 22:18
鑫龙 阅读(627)
评论(0) 编辑 收藏 引用 所属分类:
STL
问题的由来:
vector<int> coll;
.....
sort(++coll.begin(),coll.end());
对于sort那句,如果vecotor的底层是用指针实现(通常就是用指针实现),那么编译无法通过。
其实此次问题该系列上一次文章类似<<
c++标准程序库----p55----为什么需要auto_ptr_ref? (转)>>,都是临时对象惹的祸。
c++不允许任何修改基本类型(包括指针)临时值的行为,但对于类类型则允许。怎么理解呢?举个例子:
#include <iostream>
using namespace std;
class node
{
public:
node(int j = 0):i(j){}
int i;
void operator++()//这里重定义一个赋值操作符=,为下面的赋值做准备。
{
i++;
}
};
node fun()
{
node temp(1);
return temp;//这里返回一个类的临时变量
}
int* fun2()
{
int a =1;
int* b = &a; //这里返回存在栈中局部变量的地址是不对的,但只是做实验!
return b;//这里返回一个普通int临时变量
}
int main()
{
++fun(); // ok!
++fun2(); //这句无法通过编译
system("pause");
}
上面的例子fun()返回类类型的临时变量可以被修改,但fun2()返回的指针的临时变量不能被修改。
回到开始的例子,因为vector的迭代器底层是用指针实现,所以begin()函数返回的是一个指针类型的临时变量,如果用++操作去修改,那就违反了c++的设计原则,所以无法编译通过。做到底还是左值不能被修改!!!