Is there any real use case for function's reference qualifiers?

前端 未结 2 735
北恋
北恋 2021-02-07 06:21

Recently I learned about function\'s reference qualifiers, e.g.

struct foo
{
    void bar() {}
    void bar1() & {}
    void bar2() && {         


        
相关标签:
2条回答
  • 2021-02-07 06:43

    Where I might need this feature, is there any real use case for this language feature ?

    The example you show is pretty useless, it's more useful when you have an overloaded function, one version that operates on lvalues and one that operates on rvalues.

    Consider a type a bit like std::stringstream that owns a string and returns it by value. If the object is an rvalue, it can move the string instead of copying it.

    class StringBuilder
    {
    public:
      std::string get() const& { return m_str; }
      std::string get() && { return std::move(m_str); }
    
    private:
      std::string m_str;
    };
    

    This means when you return a StringBuilder from a function and want to get the string out of it, you don't need a copy:

    std::string s = buildString().get();
    

    More generally, given a function f(const X&) if it would be useful to overload it with f(X&&), then given a member function X::f() it might be useful to change it to X::f() const& and overload it with X::f()&&

    0 讨论(0)
  • 2021-02-07 06:46

    There are basically two uses:

    1. To provide an optimized overload, for example to move a member out of a temporary object instead of having to copy it.
    2. Prevent misuse of an API. For example, no one would expect

      int a = 1 += 2;
      

      to work and this would also cause a compile error. However

      string b = string("foo") += "bar";
      

      is legal if operator += is declared as

      string & operator += (string const & o);
      

      as is usually the case. Also this has the nasty side-effect of providing an lvalue-reference to your rvalue. Bad idea. This can easily be prevented by declaring the operator as

      string & operator += (string const & o) &;
      
    0 讨论(0)
提交回复
热议问题