程序员的故乡

 

对于同一个成员方法分别定义左值和右值的实现版本

对于同一个成员方法分别定义左值和右值的实现版本

有时候需要对同一个成员方法定义不同的实现,比如如果当前this右值时,可以用一些移动语义来优化性能。这时候需要通过添加函数的限定符来为this为右值时定义专门的方法实现。

在函数声明后面加上&,表示该方法只能被左值对象调用;在函数声明后面加上&&,表示该方法只能被右值对象调用。配合const限定符就有四种组合。下面的代码详细展示这四种组合。其中右值常数是没有什么意义的,但是语法上是允许的。

#include <iostream>

// 在函数声明后面加上&,表示该方法只能被左值对象调用。
// 在函数声明后面加上&&,表示该方法只能被右值对象调用。
struct Person
{
    void say() const &  // this为左值常数的say()方法版本。
    {
        std::cout << "const lvalue say()." << std::endl;
    }

    void say() const&&   // 常量右值没有什么意义,移动语义理论上是要修改原对象的内容的,否则就是复制了(真正的复制是不会影响原对象的)。
    {
        std::cout << "const rvalue say()." << std::endl;
    }

    void say() &  // this为左值的say()方法版本。
    {
        std::cout << "lvalue say()." << std::endl;
    }

    void say() &&  // this为右值的say()方法版本。
    {
        std::cout << "rvalue say()." << std::endl;
    }
};

int main()
{
    Person a;
    a.say();

    const Person& b = a;
    b.say();

    std::move(a).say();

    std::move(b).say();
}

posted on   程鑫  阅读(37)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

导航

统计

点击右上角即可分享
微信分享提示