Posted on 2012-12-23 22:18
鑫龍 閱讀(651)
評論(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++的設計原則,所以無法編譯通過。做到底還是左值不能被修改!!!