C++11新特性之 rvalue Reference(右值引用)

 

 

#include <iostream>

int getValue ()
{
    int ii = 10;
    return ii;
}

int main()
{
    std::cout << getValue();
    return 0;
}
 

 

root@ubuntu:~/c++# g++ -std=c++11  right.cpp -o auto
root@ubuntu:~/c++# ./auto
10 

右值有更隐晦的,记住如果一个表达式的结果是一个暂时的对象,那么这个表达式就是右值

这里需要注意的是 getValue() 是一个右值。

我们只能这样做,必须要有const

const int& val = getValue(); // OK
int& val = getValue(); // NOT OK

 

#include <iostream>

int getValue ()
{
    int ii = 10;
    return ii;
}

int main()
{
    int & val = getValue();
    return 0;
}

 

 

root@ubuntu:~/c++# g++ -std=c++11  right.cpp -o auto
right.cpp: In function ‘int main()’:
right.cpp:11:25: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
     int & val = getValue();
                         ^
root@ubuntu:~/c++# 

 

#include <iostream>

int getValue ()
{
    int ii = 10;
    return ii;
}

int main()
{
    const int & val = getValue();
    return 0;
}

但是C++11中的右值引用允许这样做:

const int&& val = getValue(); // OK
int&& val = getValue(); //  OK

 

#include <iostream>

int getValue ()
{
    int ii = 10;
    return ii;
}

int main()
{
    const int & val = getValue();
    const int && val2 = getValue();
    int && val3 = getValue();
    return 0;
}

 

void printReference (const int& value)
{
        cout << value;
}

void printReference (int&& value)
{
        cout << value;
}

第一个printReference()可以接受参数为左值,也可以接受右值。
而第二个printReference()只能接受右值引用作为参数。

 

#include <iostream>

using namespace std;

void printReference (int& value)
{
        cout << "lvalue: value = " << value << endl;
}

void printReference (int&& value)
{
        cout << "rvalue: value = " << value << endl;
}

int getValue ()
{
    int temp_ii = 99;
    return temp_ii;
}

int main()
{ 
    int ii = 11;
    printReference(ii);
    printReference(getValue());  //  printReference(99);
    return 0;
}
 

 

root@ubuntu:~/c++# ./auto
lvalue: value = 11
rvalue: value = 99

 

上一篇:软件测试____性能面试题_____性能测试的bug


下一篇:7 Publisher Confirms