移动语义1: 值类别

题目描述

在C++11后引入了“右值引用”的概念。

与之相对的,我们在课程上所涉及到的概念被称之为“左值引用”。顾名思义,左值引用只能绑定到左值表达式上,而右值引用只能绑定到右值表达式上。我们用T&&类型说明符声明一个右值引用变量,例如:double&& PI = 3.1415926;

右值引用的一个作用是:判断值类别。例如,当一个函数重载了void f(int&)void f(int&&)时,下列代码会执行相应的预期行为:

int main(){
    int x = 2;
    f(x);  //调用f(int&)
    f(3);  //调用f(int&&)
}

因此,可以利用这种方式判断不同的值类别。补全下列代码,使得输出符合预期。

关于输入

关于输出

见样例输出

参考答案

#include <iostream>
using std::cout, std::endl;
class A{
public:
    int val;
    A(int x): val(x){}
    friend std::ostream& operator<<(std::ostream &os, const A &a){
        return os << a.val;
    }
};
void f(int& t){
    cout << "lvalue: " << t << endl;
}
void f(double& t){
    cout << "lvalue: " << t << endl;
}
void f(A& t){
    cout << "lvalue: " << t << endl;
}
void f(int&& t){
    cout << "rvalue: " << t << endl;
}
void f(double&& t){
    cout << "rvalue: " << t << endl;
}
void f(A&& t){
    cout << "rvalue: " << t << endl;
}
int main(){
    int x = 1;
    int* p = &x;
    int&& y = 2;
    A a(2);
    f(x);
    f(1);
    f(x + 0.5);
    f(x++);
    f(++x);
    f(*p);
    f(y);
    f(a);
    f(A(5));
    f(a.val);
    f(A(x));
    f(x = 5);
    f((x, 2));
    f((2, x));
}










 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 




















#include <iostream>
using std::cout, std::endl;
class A{
public:
    int val;
    A(int x): val(x){}
    friend std::ostream& operator<<(std::ostream &os, const A &a){
        return os << a.val;
    }
};
template <typename T>
void f(T& t){
    cout << "lvalue: " << t << endl;
}
template <typename T>
void f(T&& t){
    cout << "rvalue: " << t << endl;
}
int main(){
    int x = 1;
    int* p = &x;
    int&& y = 2;
    A a(2);
    f(x);
    f(1);
    f(x + 0.5);
    f(x++);
    f(++x);
    f(*p);
    f(y);
    f(a);
    f(A(5));
    f(a.val);
    f(A(x));
    f(x = 5);
    f((x, 2));
    f((2, x));
}