程序员的故乡

 

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

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

有时候需要对同一个成员方法定义不同的实现,比如如果当前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 2023-09-10 21:14  程鑫  阅读(18)  评论(0编辑  收藏  举报

导航