tom*_*myk 18 c++ c++11 ref-qualifier c++14
最近我了解到function's reference qualifiers,例如
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
Run Code Online (Sandbox Code Playgroud)
我可能需要此功能的地方,这个语言功能是否有任何实际用例?
Jon*_*ely 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;
};
Run Code Online (Sandbox Code Playgroud)
这意味着当您StringBuilder从函数返回并希望从中获取字符串时,您不需要副本:
std::string s = buildString().get();
Run Code Online (Sandbox Code Playgroud)
更一般地,给一个函数f(const X&),如果将它与过载有用f(X&&),然后给出一个成员函数X::f()它可能是将其更改为有用的X::f() const&,并与它超载X::f()&&
Joe*_*Joe 16
基本上有两种用途:
防止滥用API.例如,没人会指望
int a = 1 += 2;
Run Code Online (Sandbox Code Playgroud)
工作,这也会导致编译错误.然而
string b = string("foo") += "bar";
Run Code Online (Sandbox Code Playgroud)
如果operator +=声明为合法是合法的
string & operator += (string const & o);
Run Code Online (Sandbox Code Playgroud)
通常就是这种情况.这也有一个令人讨厌的副作用,即为你的右值提供左值引用.馊主意.通过将运算符声明为可以很容易地防止这种情况
string & operator += (string const & o) &;
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |