• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    6年前 (2013-04-19)  C++ |   3 条评论  27 
    文章评分 0 次,平均分 0.0

    左值引用根据其修饰符的不同,可以分为非常量左值引用(int &r =i;)和常量左值引用(const int &r =i;)。
    11
    非常量左值引用只能绑定到非常量左值,不能绑定到常量左值、非常量右值和常量右值。如果允许绑定到常量左值和常量右值,则非常量左值引用可以用于修改常量左值和常量右值,这明显违反了其常量的含义。如果允许绑定到非常量右值,则会导致非常危险的情况出现,因为非常量右值是一个临时对象,非常量左值引用可能会使用一个已经被销毁了的临时对象。
    常量左值引用可以绑定到所有类型的值,包括非常量左值、常量左值、非常量右值和常量右值。
    右值引用根据其修饰符的不同,也可以分为非常量右值引用和常量右值引用。
    非常量右值引用只能绑定到非常量右值,不能绑定到非常量左值、常量左值和常量右值(VS2010 beta版中可以绑定到非常量左值和常量左值,但正式版中为了安全起见,已不允许)。如果允许绑定到非常量左值,则可能会错误地窃取一个持久对象的数据,而这是非常危险的;如果允许绑定到常量左值和常量右值,则非常量右值引用可以用于修改常量左值和常量右值,这明显违反了其常量的含义。
    常量右值引用可以绑定到非常量右值和常量右值,不能绑定到非常量左值和常量左值(理由同上)。可以看出,使用左值引用时,我们无法区分出绑定的是否是非常
    来看下面的代码:

    #include
    using namespace std;
    template
    int compare(T &a,T &b)
    {
    	if(a < b) return 1;
    	else if( b < a) return -1;
    	else return 0;
    }
    
    int main()
    {
    	cout<<compare(1,2)<<endl;
    	cout<<compare("456","123")<<endl;
    	cout<<compare("4567","123")<<endl;
    }

    cout<<compare(1,2)<<endl;这个出错,原因是1,2都是常量右值,也即是作为参数传递时会产生两个临时变量,临时变量不能绑定到引用。
    cout<<compare("456","123")<<endl;这个正确的原因是,“456”,“123”为常量文本,会存放在常量区。
    cout<<compare("4567","123")<<endl;出错的原因,一个参数为const char[5],一个参数为const char[4],模板不能生成对于的函数。
    由第二和第三可以看出,当模板函数的参数为引用时,传递字符串常量并不是传递指针,而是传递整个数组。

    再看下面:

    const int &a = 1;
    char *const &p ="456";
    int &b = 1;
    char *&p1 = "456";

    前两个正确,后两个则错误。
    修改成

    int compare(const T &a,const T &b)
    {
    	if(a < b) return 1;
    	else if( b < a) return -1;
    	else return 0;
    }

    也是可以的。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/782.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享