代码之家  ›  专栏  ›  技术社区  ›  Hanfei Sun

如何根据对象是否为rvalue引用路由到不同的实现?[副本]

  •  1
  • Hanfei Sun  · 技术社区  · 5 年前

    例如,我有一个名为 MyClass 并从中创建一个实例:

    auto obj = MyClass()
    

    我有两种方法调用它的方法。

    选项1:直接调用方法

    obj.method()
    

    方案2:铸造 obj 先对引用赋值,然后调用方法

    std::move(obj).method()
    

    我想知道是否可以创建不同的 method 在选项1和选项2之间。是否有方法根据对象是否为rvalue引用来路由/重载该方法?

    1 回复  |  直到 5 年前
        1
  •  1
  •   songyuanyao    5 年前

    可以用声明成员函数 reference qualifiers . 例如

    class MyClass {
    public:
        void method() & { std::cout << "on lvalue\n"; }
        void method() && { std::cout << "on rvalue\n"; }
    };
    

    然后

    auto obj = MyClass();
    obj.method();            // invoke the lvalue version
    std::move(obj).method(); // invode the rvalue version
    

    是否有方法根据对象是否为rvalue引用来路由/重载该方法?

    准确地说,在重载解析中选择哪个重载取决于要调用的对象是左值还是右值,而不是其类型是否为右值引用。类型和 value categories 是两个独立的东西。