• 【9】c++11新特性 —>&&的特性


    c++中,不是所有情况下&&都代表一个右值引用,具体的场景体现在模板和自动类型推到中,如果是模板参数,需要指定为&&,如果是自动类型推到需要指定为auto&&,在这两种场景下&&被称为未定义的引用类型,另外还有一点需要额外注意const T&&表示一个右值引用,不是未定义类型。
    例1:

    template<typename T>
    void f(T&& param);
    void f1(const T&& param); //const T&&表示一个右值引用
    f(10); 	 //10是右值,所有T&&表示右值引用
    int x = 10;
    f(x);    //x是左值,所以T&& 表示左值引用
    f1(x);	// error, x是左值,const T&&表示一个右值引用
    f1(10); // ok, 10是右值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例2:

    int x = 520;
    int y = 1314;
    auto&& v1 = x; // auto&& 表示左值引用
    auto&& v2 = 250; //auto&&表示右值引用
    
    • 1
    • 2
    • 3
    • 4

    由于上述代码中存在T&&或者auto&&这种未定引用类型,当它作为参数时,有可能被一个右值引用初始化,也有可能被一个左值引用初始化,在进行类型推导时右值引用类型(&&)会发生变化,这种变化被称为引用折叠。在C++11中引用折叠的规则如下:
    (1)通过右值推导T&&或者auto&& 得到的是一个右值引用类型;
    (2)通过非右值(右值引用、左值、左值引用、常量右值引用、常量左值引用)推导T&&或者auto&& 得到的是一个左值引用类型;
    总结:就是说只要不是通过右值推导,那就是左值引用;

    int&& a1 = 5;   //右值引用
    auto&& bb = a1; //左值引用
    auto&& bb1 = 5; //右值引用
    
    int a2 = 5; 
    int &a3 = a2;    //左值引用
    auto&& cc = a3;  //左值引用
    auto&& cc1 = a2; //左值引用
    
    const int& s1 = 100; //左值引用
    const int&& s2 = 100; //右值引用
    auto&& dd = s1;  //左值引用
    auto&& ee = s2;  //左值引用
    
    const auto&& x = 5;  //const auto&&不是自动推导类型,他表示一个右值引用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #include 
    using namespace std;
    
    void printValue(int& i)
    {
        cout << "l-value: " << i << endl;
    }
    
    void printValue(int && i)
    {
        cout << "r-value: " << i << endl;
    }
    
    void forward(int&& k)
    {
        printValue(k); //k作为一个命名对象,这里是左值引用
    }
    
    int main()
    {
        int i = 520;
        printValue(i); //左值引用
        printValue(1314);  //右值引用
        forward(250);  //左值引用
    
        int&& t = 100;
        printValue(t);
    
        return 0;
    };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    绿色至未来,积极应对树木资源消耗问题-FSC认证
    Pytorch 多卡并行(2)—— 使用 torchrun 进行容错处理
    python 二手车数据分析以及价格预测
    SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式
    三角函数万能公式
    贪心算法作业之汽车加油问题
    力扣刷题之数组专栏(共16道题)
    【Vue3】第十二部分 Vue-Router 4 (路由)
    Redis 实战缓存
    拿走吧你,Fiddler模拟请求发送和修改响应数据
  • 原文地址:https://blog.csdn.net/weixin_42097108/article/details/134256953