函数的引用限定符是否有任何实际用例?
Is there any real use case for function's reference qualifiers?
最近我了解到function's reference qualifiers
,例如
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
我可能需要此功能的地方,是否有此语言功能的实际用例?
Where I might need this feature, is there any real use case for this language feature ?
您展示的示例非常无用,当您有一个重载函数时它会更有用,一个版本对左值进行操作,另一个对右值进行操作。
考虑一个有点像 std::stringstream
的类型,它拥有一个字符串并 return 按值对其进行排序。如果对象是右值,它可以移动字符串而不是复制它。
class StringBuilder
{
public:
std::string get() const& { return m_str; }
std::string get() && { return std::move(m_str); }
private:
std::string m_str;
};
这意味着当您从一个函数 return 一个 StringBuilder
并想要从中获取字符串时,您不需要副本:
std::string s = buildString().get();
更一般地说,给定一个函数 f(const X&)
如果用 f(X&&)
重载它是有用的,那么给定一个成员函数 X::f()
它 可能 将其更改为 X::f() const&
并用 X::f()&&
重载它很有用
基本上有两种用途:
- 提供优化的重载,例如将成员移出临时对象,而不必复制它。
防止误用 API。例如,没有人会想到
int a = 1 += 2;
工作,这也会导致编译错误。不过
string b = string("foo") += "bar";
如果 operator +=
被声明为 , 是合法的
string & operator += (string const & o);
通常都是这样。这也有一个令人讨厌的副作用,即为您的右值提供左值引用。馊主意。通过将运算符声明为
可以很容易地避免这种情况
string & operator += (string const & o) &;
最近我了解到function's reference qualifiers
,例如
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
我可能需要此功能的地方,是否有此语言功能的实际用例?
Where I might need this feature, is there any real use case for this language feature ?
您展示的示例非常无用,当您有一个重载函数时它会更有用,一个版本对左值进行操作,另一个对右值进行操作。
考虑一个有点像 std::stringstream
的类型,它拥有一个字符串并 return 按值对其进行排序。如果对象是右值,它可以移动字符串而不是复制它。
class StringBuilder
{
public:
std::string get() const& { return m_str; }
std::string get() && { return std::move(m_str); }
private:
std::string m_str;
};
这意味着当您从一个函数 return 一个 StringBuilder
并想要从中获取字符串时,您不需要副本:
std::string s = buildString().get();
更一般地说,给定一个函数 f(const X&)
如果用 f(X&&)
重载它是有用的,那么给定一个成员函数 X::f()
它 可能 将其更改为 X::f() const&
并用 X::f()&&
基本上有两种用途:
- 提供优化的重载,例如将成员移出临时对象,而不必复制它。
防止误用 API。例如,没有人会想到
int a = 1 += 2;
工作,这也会导致编译错误。不过
如果string b = string("foo") += "bar";
operator +=
被声明为 ,是合法的
string & operator += (string const & o);
通常都是这样。这也有一个令人讨厌的副作用,即为您的右值提供左值引用。馊主意。通过将运算符声明为
可以很容易地避免这种情况string & operator += (string const & o) &;