首页 > 其他分享 >常量左值引用和右值引用

常量左值引用和右值引用

时间:2023-04-01 15:46:44浏览次数:34  
标签:Val 右值 void 左值 back 引用

故事要从 <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;
}

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

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

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

标签:Val,右值,void,左值,back,引用
From: https://www.cnblogs.com/enthalpy/p/17278707.html

相关文章

  • Vue引用富文本编辑器
    1.在package.json加上并安装依赖"devDependencies":{"@jsdawn/vue3-tinymce":"^1.1.7",}2.在页面中引入importVue3Tinymcefrom"@jsdawn/vue3-tinymce";3.使用<vue3-tinymcev-model="item.blockDataObj.text":setting=&qu......
  • Vue引用富文本编辑器
    1.在package.json加上并安装依赖"devDependencies":{"@jsdawn/vue3-tinymce":"^1.1.7",}2.在页面中引入importVue3Tinymcefrom"@jsdawn/vue3-tinymce";3.使用<vue3-tinymcev-model="item.blockDataObj.text":s......
  • 错题一:java中的值传递与引用传递
    考察的知识点:在java中,原始数据类型的传递都是值传递,传递的是值的副本,形参改变对实参没有影响;引用传递传递的是引用类型数据(传递的是内存地址),如String、Map、类对象等,因此形参发生变化实参也会随之变化。原始题目:classValue{publicinti=15;}publicclassTest{pu......
  • Asp.Net Framework项目优化前端文件引用
    背景:公司一个老项目,前端引用都是直接引用文件,这样导致每次发布都存在用户浏览器缓存问题,常见做法是找到每个引用前端文件处加?version,但是太麻烦了解决思路:1.找到所有前端文件2.jenkins每次编译更新版本号,把新的版本号拼接到前端文件引用处实现:1.首先在扩展类里面扩展以......
  • Node.js:模块查找,引用及缓存机制
    1.Node.js的模块载入方式与机制Node.js中模块可以通过文件路径或名字获取模块的引用。模块的引用会映射到一个js文件路径,除非它是一个Node内置模块。Node的内置模块公开了......
  • Docker 部署引用gdal包的Python程序
    1下载gdal的基于Ubuntu全镜像dockerpullosgeo/gdal:ubuntu-full-3.5.3这个镜像里包含了gdal和扩展包2运行镜像并进入dockerrun-ditosgeo/gdal:ubuntu-full-3......
  • 第六篇 引用类型 - 函数 - Function
    函数—javascript的第一等公民函数的多变来源于参数的灵活多变和返回值的多变普通函数—如果参数是一般的数据类型或一般对象,这样的函数就是通函数高级函数—如......
  • 对象引用对于非静态的字段、方法或属性“HttpContext.User”是必需的
    控制器内的HttpContext是从ControllerBase继承的属性,如果在控制器外使用HttpContext只是一个类,因此只能访问它的静态成员。为了访问它,您必须通过或沿线路注入HttpContext......
  • 引用和指针的区别
    1、定义和性质不同1、指针是一个变量,存储的地址,指向内存单元2、引用是变量的别名,跟原始变量是同一块内存inta=10;int*p=&a;//p是指针,&在此是取地址运算in......
  • 引用
    一、引用的基本概念引用变量是C++新增的符合类型。引用时已定义的变量名。引用的主要用途是作用函数的形参和返回值。声明/创建引用的语法:数据类型&......