常量左值引用和右值引用

故事要从 <vector> 头文件说起。

查看 push_back 函数,发现有两个重载。

_CONSTEXPR20 void push_back(const _Ty& _Val) { // insert element at end, provide strong guarantee
    emplace_back(_Val);
}

_CONSTEXPR20 void push_back(_Ty&& _Val) {
    // insert by moving into element at end, provide strong guarantee
    emplace_back(_STD move(_Val));
}

我们看看在参数为右值的情况下,两种参数描述是否会表现出相同的行为。进行如下两个实验:

#include <iostream>
using namespace std;

void f(int&& x)
{
    cout << &x;
}

int main()
{
    int x = 0;
    cout << &x << "\n";
    f(move(x));
    return 0;
}
#include <iostream>
using namespace std;

void f(const int& x)
{
    cout << &x;
}

int main()
{
    int x = 0;
    cout << &x << "\n";
    f(move(x));
    return 0;
}

发现输出的地址都是相同的,这说明这两种方式都能够避免创建新变量。那么为什么需要右值引用呢?

原因很简单,使用常量左值引用时不能修改参数,而使用右值引用时可以修改。

可以总结如下:

不使用引用 左值引用 常量左值引用 右值引用 常量右值引用(没必要)
创建新变量 只能传入左值 既能传入左值,也能传入右值,参数不可修改 只能传入右值 只能传入右值,参数不可修改

综上,对于不同情况,应该使用不同的参数描述。这样做使得程序在满足功能需求的同时达到效率最大化。

posted @ 2023-04-01 15:33  专业户  阅读(52)  评论(0)    收藏  举报