非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)

int f (int & I)
{
    cout<<I<<std::endl;
}

void main()
{
    long L;
    f(L);      // 编译不过
    f((int)L); // 编译不过
    f((int&)L);// 编译过
}

 编译不会通过,这种情况下pL不会自动转换成int *,因为类型转换会生成临时变量,不能接收函数返回值

 void func(int *& a){};
    void * p;
    int * pint;
    func(pint);
    func((int *)p);//报错 invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'
    func((int *&)p);

函数声明可以看出,此种函数的作用应该是:
    1.通过参数a传入内容做一些事2.修改参数a的值。
   

    此时倘若我们按照第二种调用方式的结果是,倘若func中改变了参数的值,改变的是经过了转换之后生成的一个临时变量的值,并不能达到修改p的目的,即与函数本身作用不符。编译器认为这一定不会是我们想实现的,所以直接报错。

 

引用别人表述:

    c++编译器的一个关于语义的限制。如一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。如果你一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制,意在限制这个非常规用法的潜在错误。
    说直白一点,如果你把临时变量作为非const引用参数传递,一方面,在函数申明中,使用非常量型的引用告诉编译器你需要得到函数对某个对象的修改结果,可是你自己又不给变量起名字,直接丢弃了函数的修改结果,编译器只能说:“大哥,你这是干啥呢,告诉我把结果给你,等我把结果给你了,你又直接给扔了,你这不是在玩我呢吗?”所以编译器一怒之下就不让过了。这下大家明白了吧?

posted @ 2013-07-29 00:08  dzqabc  阅读(938)  评论(0编辑  收藏  举报