C++编程法则100条(11)关于&&&修饰成员函数的含义
Posted 奇妙之二进制
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++编程法则100条(11)关于&&&修饰成员函数的含义相关的知识,希望对你有一定的参考价值。
🥇 关于博主👇🏻👇🏻👇🏻
👀 作者简介: 热衷于知识探索和分享的技术博主。
💂 csdn主页::【奇妙之二进制】
✍️ 微信公众号:【Linux 世界】🎉精彩专栏:
💪 【C++编程法则100条】
🎓 【面向工作git基础教程】
🧡 【C++11新特性深入剖析】
📚 【shell脚本编程基础与实战】
🌎 【Linux网络编程面试】
✍️ 【C++编译工具cmake入门到精通】
🤩 【Linux文本处理三剑客】
😉 【C++模板编程】
🥰 【VIM实用指南】
🔥 【Linux C/C++编译链接和调试调优】
✨ 【面向对象分析和设计】
🎉 【Ubuntu/Linux系统管理】
🤔 【C/C++笔面试精选】
✔️ 【Linux并发编程面试与实战】
🚀 【C/C++常用开源库实战】
😊 【Linux常用命令详解】
…💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 💪坚持创作,热衷分享,初心未改,继往开来!
参考:https://en.cppreference.com/w/cpp/language/member_functions#member_functions_with_cv-qualifiers
&、&&可以用于修饰成员函数,并且像const一样,可以重载。
#include <iostream>
struct S
void f() & std::cout << "lvalue\\n";
void f() && std::cout << "rvalue\\n";
;
int main()
S s;
s.f(); // s是个左值,prints "lvalue"
std::move(s).f(); // 经过move之后变成右值,prints "rvalue"
S().f(); // 临时对象是个右值,prints "rvalue"
&标识的传入成员函数的this指针指向的是一个左值,
&&标识传入成员函数的this指针指向的是一个右值。
类比const成员函数,此时编译器会将void f()&
翻译成 void f(S& *const this)
, 将void f() &&
翻译成 void (S&& *const this)
。
原理我们理解了,那有什么用途呢?
目的很显然,就是为了区分传递进来的对象是左值还是右值,如果传递进来的对象是右值,那么直接剥夺(move)它的资源挪为己用,
例如:
#include <iostream>
#include <string>
class P
public:
std::string GetText() &
std::cout << "lvalue called\\n";
return text;
std::string GetText() &&
std::cout << "rvalue called\\n";
return std::move(text);
private:
std::string text;
;
int main()
P p;
p.GetText();
P().GetText();
右值版本GetText返回string时不能重新分配资源,效率高些。
左值版本的GetText就没办法,总不能把左值的资源给剥夺了。
以上是关于C++编程法则100条(11)关于&&&修饰成员函数的含义的主要内容,如果未能解决你的问题,请参考以下文章