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)关于&&&修饰成员函数的含义的主要内容,如果未能解决你的问题,请参考以下文章

C++编程法则100条转换构造函数

C++编程法则100条friend友元函数

C++编程法则100条(10)using用法之声明

C++编程法则100条空{}初始化讨论

c++编程 多项式的乘法

在 linux 下的 c++ 程序中包含 amp.h 库