函数的引用限定符有任何实际用例吗?

问题描述 投票:0回答:2

最近我了解了

function's reference qualifiers
,例如

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

我可能需要此功能的地方,此语言功能有任何实际用例吗?

c++ c++11 c++14 ref-qualifier function-qualifier
2个回答
29
投票

我可能需要此功能的地方,此语言功能有任何实际用例吗?

您展示的示例非常无用,当您有一个重载函数时,它更有用,一个版本对左值进行操作,一个版本对右值进行操作。

考虑一个有点像

std::stringstream
的类型,它拥有一个字符串并按值返回它。如果对象是右值,它可以移动字符串而不是复制它。

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

private:
  std::string m_str;
};

这意味着当您从函数返回

StringBuilder
并希望从中获取字符串时,您不需要副本:

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

更一般地,给定一个函数

f(const X&)
如果用
f(X&&)
重载它会很有用,那么给定一个成员函数
X::f()
可能 将其更改为
X::f() const&
并用
X::f()&& 重载它会很有用


18
投票

基本上有两种用途:

  1. 提供优化的重载,例如将成员移出临时对象,而不必复制它。
  2. 防止滥用 API。例如,没有人会想到

    int a = 1 += 2;
    

    工作,这也会导致编译错误。然而

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

    operator +=

     声明为 

    是合法的
    string & operator += (string const & o);
    

    通常情况就是这样。此外,这还有一个令人讨厌的副作用,即为您的右值提供左值引用。馊主意。通过将运算符声明为

    可以轻松防止这种情况
    string & operator += (string const & o) &;
    
© www.soinside.com 2019 - 2024. All rights reserved.