posts - 200, comments - 8, trackbacks - 0, articles - 0
     问题的由来:
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++的设计原则,所以无法编译通过。做到底还是左值不能被修改!!!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理