随笔 - 107,  文章 - 0,  评论 - 5,  阅读 - 70166
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

std::move 和 std::forward 都是 C++ 标准库中用于实现移动语义和完美转发的工具,但它们的使用场景有所不同,下面为你详细介绍它们各自的适用场景。

std::move 的使用场景

std::move 主要用于将一个左值强制转换为右值引用,从而可以触发移动语义。它通常在以下场景中使用:

1. 转移资源所有权

当你想要将一个对象的资源(如动态分配的内存、文件句柄等)转移到另一个对象时,可以使用 std::move。例如,在使用标准库容器时,移动操作可以避免不必要的深拷贝,提高性能。
#include
#include

int main() {
std::vector vec1 = {1, 2, 3};
std::vector vec2 = std::move(vec1); // 转移 vec1 的资源到 vec2
std::cout << "vec1 size: " << vec1.size() << std::endl; // 输出 0
std::cout << "vec2 size: " << vec2.size() << std::endl; // 输出 3
return 0;
}

2. 自定义类的移动构造和移动赋值

在自定义类中,如果你想要实现移动构造函数和移动赋值运算符,需要使用 std::move 来将参数转换为右值引用,以便调用移动语义。
#include
#include

class MyClass {
public:
std::string data;

\ // 移动构造函数
MyClass(MyClass&& other) noexcept : data(std::move(other.data)) {
other.data.clear();
}

\ // 移动赋值运算符
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) {
data = std::move(other.data);
other.data.clear();
}
return *this;
}
};

int main() {
MyClass obj1;
obj1.data = "Hello";
MyClass obj2 = std::move(obj1); // 调用移动构造函数
std::cout << "obj1 data: " << obj1.data << std::endl; // 输出空字符串
std::cout << "obj2 data: " << obj2.data << std::endl; // 输出 "Hello"
return 0;
}

std::forward 的使用场景

std::forward 主要用于实现完美转发,即在模板函数中,将参数以原始的左值或右值属性转发给其他函数。它通常在以下场景中使用:

1. 函数模板的完美转发

当你编写一个函数模板,需要将参数原封不动地转发给另一个函数时,可以使用 std::forward。这样可以保证参数的左值或右值属性在转发过程中不被改变。
#include
#include

void print(int& value) {
std::cout << "Lvalue: " << value << std::endl;
}

void print(int&& value) {
std::cout << "Rvalue: " << value << std::endl;
}

template
void forwarder(T&& arg) {
print(std::forward(arg)); // 完美转发参数
}

int main() {
int x = 42;
forwarder(x); // 传递左值
forwarder(123); // 传递右值
return 0;
}

在上述代码中,forwarder 是一个函数模板,它接受一个通用引用 T&&。通过 std::forward(arg),可以将参数 arg 以原始的左值或右值属性转发给 print 函数。

2. 构造函数的完美转发

在类的构造函数中,如果你需要将参数完美转发给基类的构造函数或成员对象的构造函数,可以使用 std::forward。
#include
#include

class Base {
public:
Base(int value) {
std::cout << "Base constructor: " << value << std::endl;
}
};

class Derived : public Base {
public:
template<typename... Args>
Derived(Args&&... args) : Base(std::forward(args)...) {
std::cout << "Derived constructor" << std::endl;
}
};

int main() {
Derived d(42);
return 0;
}
在上述代码中,Derived 类的构造函数使用了可变参数模板和完美转发,将参数完美转发给 Base 类的构造函数。
综上所述,std::move 主要用于触发移动语义,转移资源所有权;而 std::forward 主要用于实现完美转发,保持参数的左值或右值属性。

posted @ 2025-02-28 14:48 keleman 阅读(7) 评论(0) 推荐(0) 编辑
摘要: ''#include std::mutex m_mutex; ... std::lock_guard lock(m_mutex); //A .. 以上代码编译 提示 C2955 ,没有模板参数 改为 std::lock_guardstd::mutex lock(m_mutex); 编译成功 但是 有 阅读全文
posted @ 2024-12-02 16:03 keleman 阅读(43) 评论(0) 推荐(0) 编辑
摘要: QApplication::postEvent(receriver ,qevent*.) 将事件发送到receiver 对象所在的子线程进行执行。 receiver对象需要重载 custEvent函数(又可以叫异步调用) QApplication::sendEvent(receiver,qevent 阅读全文
posted @ 2024-11-19 15:25 keleman 阅读(22) 评论(0) 推荐(0) 编辑
摘要: 事件处理流程中的角色 event函数 event函数是QObject中事件处理的总入口。当有任何事件传递到一个QObject或者它的派生类对象时,这个函数首先被调用。它就像是一个事件调度中心,负责接收各种各样的事件,并根据事件的类型把它们分发给对应的具体处理函数。 例如,对于鼠标按下事件(QEven 阅读全文
posted @ 2024-11-19 15:18 keleman 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 必要的成员: 文件路径 QString A 文件句柄 QFile B 数据流 QDataStream C 必要的接口 load(QString fileFullPaht);加载文件并构造和DataStream的联系 save();按数据 saveAs(QString fullPath);另存,该函数 阅读全文
posted @ 2024-11-19 10:21 keleman 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 背景: 之前 只知道个 QWaitCondition 用于同步不同的线程运行状态。但不知道为何这样做。为什么还要在QWaitcondition.wai( )中还要传入一个 QMutext 变量的指针。 QWaitCondition.wait 的工作原理: QWaitCondition.wait 的工 阅读全文
posted @ 2024-10-30 14:43 keleman 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 更新软件源 sudo apt-get update 提示ca-certificates 错误 出现安全证书不信任的问题 Reading package lists... Done W: https://mirrors.aliyun.com/debian/dists/bullseye/InReleas 阅读全文
posted @ 2024-06-28 09:44 keleman 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 背景 linux的PS1的各个字段 如 \h \ w \W \d \t 等 可以通过设置显示的颜色 更加醒目 有个性 找了好几个帖子 都没看懂语法, 最后找到设置PS1字段颜色 经过实践成功 语法记录如下: - \e[ ->表示前(背)景颜色的开始设置 - x;ym ->设置的颜色 (x=1 加粗高 阅读全文
posted @ 2024-06-26 11:08 keleman 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 列表 lis =[1,2,3,4,5,6] for itm in lis: 字典 dic={'a':1,'b':3,"c":5} for k,v in dic.items(): print(.....) for k in dic.keys(): print() for v in dic.valus( 阅读全文
posted @ 2024-06-20 09:24 keleman 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 背景 : 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如: 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址) 网易云加速器 https://hub-mir 阅读全文
posted @ 2024-06-12 15:46 keleman 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 前提 1容器 用debian bookworm 建立 2设置容器代理见之前随笔 1:再宿主中建立 sources.list 文件 将bookwrom的软件源放入该文件 2:执行 docker ps -a 得到要设置的容器id 3:执行docker cp sources.list 容器id:/etc/ 阅读全文
posted @ 2024-05-29 11:09 keleman 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 缺省情况下 docker建立的容器是没有代理的。 如果容器中需要联网需要代理,必须手工设置 1方法一在 start 容器后 export http_proxy="xxxx.xxxx.xxx:8080" export https_proxy="xxxxxx.xxxx.xxxxx:8080 export 阅读全文
posted @ 2024-05-29 10:59 keleman 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 前提 linux版本 linux mint 21 代号 :jammy 使用的是aliyun的apt 源 问题 sudo apt upgrade 后总是提示 下列软件包有未满足的依赖关系: docker-ce : 依赖: containerd.io (>= 1.2.2-3) 但是它将不会被安装 依赖: 阅读全文
posted @ 2024-05-16 17:58 keleman 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 建立annconda 用 --prefix 指定路径 ~/tmp/xxx, 忘了设置名称 进入 ~/tmp 建立 xxx 目录 建立环境 conda create --prefix ./xxxx 显示环境 ,没有名称,只有环境路径 conda env list /home/tmp/xxx 删除时使用 阅读全文
posted @ 2024-04-26 11:08 keleman 阅读(55) 评论(0) 推荐(0) 编辑
摘要: 使用公司内网的机器安装 anaconda ,要使用代理才能 正常联网 。如下几种方式但始终 不成功 提示代理错误 设置ananconda 的 .condarc 的 proxy_servers字段 https_proxy https://xxxx.sxxxx:8080 http_proxy http: 阅读全文
posted @ 2024-04-25 16:54 keleman 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 1. 在 Ubuntu 上: 设置 > 网络 > 网络代理 > 手动 在 Debian 上: 设置 > 网络 > 网络代理 > 手动 2. 填充 http、https 和 ftp 的代理值。如果您有 SOCKS 代理,也请进行相应设置。保存更改后,系统将自动选择它们。 如果您使用的是 Firefox 阅读全文
posted @ 2024-04-23 14:47 keleman 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 打开终端或Anaconda Prompt。 输入以下命令以获取您的代理设置信息:conda config --show proxy_servers。 如果您没有设置代理,您将看到“No proxy set”。如果您已经设置了代理,则会显示代理的详细信息。 如果您没有设置代理,但需要配置一个,请继续以 阅读全文
posted @ 2024-04-19 15:09 keleman 阅读(3541) 评论(0) 推荐(1) 编辑
摘要: linux mint 版本号 使用终端查看 Linux Mint 版本号的方法 我将介绍几种使用非常简单的命令查看 Linux Mint 版本号和代号的方法。 你可以从 “菜单” 中打开终端,或按 CTRL+ALT+T(默认热键)打开。 本文中的最后两个命令还会输出你当前的 Linux Mint 版 阅读全文
posted @ 2024-04-09 10:06 keleman 阅读(256) 评论(0) 推荐(0) 编辑
摘要: qt 事件机制解释 阅读全文
posted @ 2024-03-15 11:06 keleman 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 如果嫌转义字符转来转去麻烦,也可以自定义替换里的分隔符,而不是用默认的”\”。 在替换命令s里自定义替换分隔符,这里用的@,也可以用|、!、^等特殊符号。前提是文本内不会出现该分隔符。 注意,这里指定的分隔符不支持多个字符,比如@|作为一个分隔符是不支持的。 将文件内的/替换为\ cat filen 阅读全文
posted @ 2024-03-14 17:23 keleman 阅读(195) 评论(0) 推荐(0) 编辑
摘要: installEventFilter函数如下: void QObject::installEventFilter(QObject *filterObj) Qt助手的解释如下: 在对象上安装一个事件过滤器filterObj。如下: monitoredObj->installEventFilter(fi 阅读全文
posted @ 2024-03-11 15:05 keleman 阅读(744) 评论(0) 推荐(0) 编辑
摘要: QT信号与槽机制与事件机制的区别 第一:什么是信号与槽?事件? 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的 阅读全文
posted @ 2024-03-11 14:33 keleman 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 1 lambda的捕获列表 类似于 bind 的参数绑定:将定义lambda定义处的绑定的变量值作为该lambda的固定参数。 e.g void callfunction() { int dd=100; int ee=200; auto lam= [dd,ee](int param1)->int{r 阅读全文
posted @ 2024-03-06 09:21 keleman 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 在 C++11的程序中,所有的值必须属于左值,将亡值,纯右值之一(持续补充)。 将亡值则是c++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(以为他用),比如返回右值引用T&&的函数返回值,std::move的返回值,或者转换为T&&的类型的转换函数的返回值。而剩余的,可以标识 阅读全文
posted @ 2024-02-05 10:50 keleman 阅读(7) 评论(0) 推荐(0) 编辑
摘要: rpm -qa|grep xxx #查询系统中所有安装的软件包中是否有 xxxx。 rpm -q |grep xxx #查询指定包xxxx 是否安装。 rpm -qi xxxx #查询指定包的信息 rpm -ivh xxxx #安装指定包 rpm -e xxxx #卸载指定包 rpm --nodep 阅读全文
posted @ 2024-01-26 16:53 keleman 阅读(8) 评论(0) 推荐(0) 编辑
摘要: boost::ref 除了可以将变量 包装为引用,还可以将函数对象(bind function<>) 包装为应用,以便作为参数传递。 但std::ref 的功能除了上面的功能还能 将函数对象以引用方式传给 模板算法。而boost:ref则不行。 boost::bind 本质就是将已有的函数(常规函数 阅读全文
posted @ 2024-01-26 16:47 keleman 阅读(9) 评论(0) 推荐(0) 编辑
摘要: VirtualBox安装CentOS后,再安装增强功能就可以共享文件夹、粘贴板以及鼠标无缝移动,主要步骤如下: 1、yum -y update 2、yum -y install g++ gcc gcc-c++ make kernel-* # 主要是在安装增强工具提示没有安装这些软件 3、yum -y 阅读全文
posted @ 2024-01-26 16:27 keleman 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 背景: 在QThread的run函数中执行耗时工作。 示例代码 void wakeThread::run() { m_waitcondition.wait(); #1 if(getThreadState()==STOP) #2 { break; } for(int i=0;i<1000;++) #3 阅读全文
posted @ 2024-01-05 10:10 keleman 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 1疑惑 如何得到 当前行的光标位置 您可以使用QPlainTextEdit的textCursor()方法来获取表示文本编辑光标当前位置的QTextCursor对象。 然后,您可以调用blockNumber()方法来获取当前行的行号, 调用positionInBlock()方法来获取光标在行内的位置( 阅读全文
posted @ 2024-01-04 16:23 keleman 阅读(419) 评论(0) 推荐(0) 编辑
摘要: c++ gui programming with qt 中关于 QThread的用法的限制 下面这句话的翻译不清 QObject is reentrant, but there are three constraints to keep in mind: Child QObjects must be 阅读全文
posted @ 2023-11-16 09:55 keleman 阅读(1728) 评论(0) 推荐(0) 编辑
摘要: 子shell 的分类 以及区别 阅读全文
posted @ 2023-08-09 17:17 keleman 阅读(10) 评论(0) 推荐(0) 编辑
摘要: #思路:修改 IFS="\n\b" $1;查找的目录路径 #!/bin/bash SAVEIFS=$IFS IFS="\n\b" for file in $(find $1 -maxdepth 1 -iname "*.jpg" -type f ) do echo file done IFS=$SAV 阅读全文
posted @ 2023-07-20 15:17 keleman 阅读(44) 评论(0) 推荐(0) 编辑
摘要: 1 打开 /etc/default/grub 文件 sudo vi /etc/default/grub 将 set default 的值从 0改为 4 因为开机界面中 win10的次序是5。0是第1项,4是第五项 保存退出 2 运行 sudo update-grub2 这样就可以刷新启动项缺省值 阅读全文
posted @ 2023-06-19 20:26 keleman 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 背景: 内网机上虚拟机是redhat 6.5 有安装映像盘xxxx.iso 要建立基于安装影响盘的本地源 过程: 1:虚拟机-》可移动设备-》cd/vcd ->设置 选择 选择 映像盘 xxxx. iso 2:iso 自动挂载到 /media/"xxxx" 。也可手工mount到指定目录 如 :/m 阅读全文
posted @ 2023-03-08 16:30 keleman 阅读(246) 评论(0) 推荐(0) 编辑
摘要: #原因 设置 新建面板 结果误删已有面板,造成 整个桌面空白 没了面板,无法操作。 可以通过快捷键启动 terminal *** #解决方法 方案1 1:幸亏有设置root密码 ,su root 后新建 用户 2:重启用新用户进入。但操作不如之前用户,一些软件不能使用 方案2 3:网上查找 用 su 阅读全文
posted @ 2023-02-22 10:35 keleman 阅读(245) 评论(0) 推荐(0) 编辑
摘要: ##配置 256 的固态盘,1t的机械盘 分区为gpt 引导 应该是uefi (msinfo32 ->bios M****) ##计划: windows10必装 到256 的固态盘 只给它 200G linuxmint 安装到 机械盘 各个区中共分配100G 剩余的空间 可能的话再安装 其他Linu 阅读全文
posted @ 2023-02-22 10:15 keleman 阅读(81) 评论(0) 推荐(0) 编辑
摘要: virtual box 下载地址 http://download.virtualbox.org/virtualbox/ VBoxGuestAdditions.iso下载地址 Index of http://download.virtualbox.org/virtualbox 选择自己对应版本下载 比 阅读全文
posted @ 2022-12-02 10:10 keleman 阅读(1658) 评论(0) 推荐(0) 编辑
摘要: linux 安装 snap 阅读全文
posted @ 2022-11-12 16:41 keleman 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 之前只用过一维指针或数组的监视。数组和指针不想 vector那样鼠标移到那里就可以看到变量,而是需要通过监视。右键要监视的数组或指针,从候选菜单中选择add watch或quick watch。 其中add watch会将变量添加到watch窗口中,该窗口中显示多个变量;quick watch则是浮 阅读全文
posted @ 2022-10-13 15:58 keleman 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 1、Qt实现事件过滤器的步骤如下: ①、Qt调用 ###void QObject::installEventFilter (QObject* filterObj) 把filterObj对象安装(或注册)为事件过滤器,filterObj也称为过滤器对象。事件过滤器通常在构造函数中进行注册。 ②、在上一 阅读全文
posted @ 2022-10-10 10:17 keleman 阅读(343) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示