C++11新特性:左值,右值,左值引用和右值引用

    C++11新引入了右值引用的概念。

        本质上来说,左值就是在内存中可以寻址的对象(表现形式是可以通过&操作符取指),而右值是在寄存器中或者内存中的匿名对象。

        左值可以存在赋值运算符左右两边,但右值只能存在赋值运算符右边(这有个例外,当一个类对象重载了负值运算符时,该类对象作为右值也可以存在赋值运算符左边)。比如,

        int a = 0;         // a是左值

        2 = a;              // error, 2是匿名对象,是右值,不能放在赋值运算符左边

        a++ = 5;         // error,a++表达式返回的是直接数0,是个匿名对象,不能作为左值,只能作为右值

        ++a = 6;         // ok, ++a表达式返回的是对象a,因此可以作为左值(这点C++和传统C语言有所不同)

 

        引用是对象的别名,引用分为左值引用和右值引用。引用在声明时就需要被赋值。

        左值引用是对左值对象的引用,并且只能引用左值;而右值引用是对右值的引用,并且只能引用右值。一个右值表达式对象通常在表达式结束时即销毁,而右值表达式被右值引用时,会延长右值表达式对象的生命周期,直到右值引用结束。

        左值引用的语法如下:

        int a = 10;

        int &b = a;        // ok,左值引用声明时初始化,引用一个左值表达式。

        int &c = 10;      // error,左值引用只能引用左值表达式,不能引用右值表达式。

        右值引用的语法如下:

        int a = 10;

        int &&b = a;    // error, 右值引用只能引用右值表达式,不能引用左值表达式。

        int &&c = 10;    // ok

    这里有个需要注意的是:普通函数和类静态成员函数的函数名既是左值,也是右值(即,函数名既可以赋值给左值引用,也可以赋值给右值引用)。如下:

void hello() {
    std::cout << "hello" << std::endl;
}

class CallBack {
public:
    CallBack();
    virtual ~CallBack();

    static void staticDump() {
        std::cout << "staticDump" << std::endl;
    }
};

int main() {
    typedef void(FuncType)();
    typedef void(FuncType1)(CallBack *);

    FuncType &func = hello;        // 普通函数hello函数名可以作为左值
    FuncType &&func1 = hello;    // 普通函数hello函数名可以作为右值
    func();
    func1();

    FuncType &funcStatic = CallBack::staticDump;        // 类静态成员函数staticDump函数名可以作为左值
    FuncType &&funcStatic1 = CallBack::staticDump;    // 类静态成员函数staticDump函数名可以作为右值
    funcStatic();
    funcStatic1();

    return 0;
}
    这里,更进一步:函数名取地址是右值:

void func() {
    std::cout << "func" << std::endl;
}

typedef void (FuncType)();
typedef void (*FuncType1)();
int main() {
    int a = 10;

    FuncType &f1 = func;
    FuncType &&f2 = func;
    f1();
    f2();
    FuncType1 &f3 = &func;        //  错误,&func是右值,不能赋值给左值引用
    FuncType1 &&f4 = &func;    // ok, &func是右值,可以赋值给右值引用

    f4();

    return 0;
}
    最后,无论是左值引用,右值引用函数名 或者 函数地址,都可以通过引用调用函数。

转载于:https://my.oschina.net/yepanl/blog/1929004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值