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

独自空忆成欢 提交于 2020-01-01 01:27:05

问题


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

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

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


回答1:


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) &;
    



回答2:


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()&&



来源:https://stackoverflow.com/questions/28026352/is-there-any-real-use-case-for-functions-reference-qualifiers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!