What's a use case for overloading member functions on reference qualifiers?

前端 未结 4 883
天涯浪人
天涯浪人 2020-11-28 08:22

C++11 makes it possible to overload member functions based on reference qualifiers:

class Foo {
public:
  void f() &;   // for when *this is an lvalue
           


        
4条回答
  •  不知归路
    2020-11-28 08:54

    In a class that provides reference-getters, ref-qualifier overloading can activate move semantics when extracting from an rvalue. E.g.:

    class some_class {
      huge_heavy_class hhc;
    public:
      huge_heavy_class& get() & {
        return hhc;
      }
      huge_heavy_class const& get() const& {
        return hhc;
      }
      huge_heavy_class&& get() && {
        return std::move(hhc);
      }
    };
    
    some_class factory();
    auto hhc = factory().get();
    

    This does seem like a lot of effort to invest only to have the shorter syntax

    auto hhc = factory().get();
    

    have the same effect as

    auto hhc = std::move(factory().get());
    

    EDIT: I found the original proposal paper, it provides three motivating examples:

    1. Constraining operator = to lvalues (TemplateRex's answer)
    2. Enabling move for members (basically this answer)
    3. Constraining operator & to lvalues. I suppose this is sensible to ensure that the "pointee" is more likely to be alive when the "pointer" is eventually dereferenced:
    struct S {
      T operator &() &;
    };
    
    int main() {
      S foo;
      auto p1 = &foo;  // Ok
      auto p2 = &S();  // Error
    }
    

    Can't say I've ever personally used an operator& overload.

提交回复
热议问题