最近我了解了function's reference qualifiers
,例如
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
我可能需要此功能,是否有此语言功能的实际用例?
答案 0 :(得分:28)
我可能需要此功能,是否有此语言功能的实际用例?
你展示的例子非常无用,当你有一个重载函数时,它会更有用,一个版本操作左值,一个版本操作右值。
考虑类似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()&&
答案 1 :(得分:16)
基本上有两种用途:
防止滥用API。例如,没人会指望
int a = 1 += 2;
工作,这也会导致编译错误。然而
string b = string("foo") += "bar";
如果operator +=
被声明为,则是合法的
string & operator += (string const & o);
通常情况如此。这也有一个令人讨厌的副作用,即为你的右值提供左值引用。馊主意。通过将运算符声明为可以很容易地防止这种情况
string & operator += (string const & o) &;