拜托,有人可以用简单的英语解释什么是“将移动语义扩展到 *this”吗?我指的是这个提议。所有我正在寻找的是那是什么以及我们为什么需要它。请注意,我确实了解通常的右值引用是什么,移动语义是基于该引用构建的。我无法掌握这样的扩展为右值引用添加了什么!
问问题
441 次
2 回答
10
引用限定符功能(指示 的类型*this
)将允许您区分是否可以在右值或左值(或两者)上调用成员函数,并基于此重载函数。第一个版本在非正式部分给出了一些理由:
防止意外:
struct S { S* operator &() &; // Selected for lvalues only S& operator=(S const&) &; // Selected for lvalues only }; int main() { S* p = &S(); // Error! S() = S(); // Error! }
启用移动语义:
class X { std::vector<char> data_; public: // ... std::vector<char> const & data() const & { return data_; } std::vector<char> && data() && { return data_; } //should probably be std::move(data_) }; X f(); // ... X x; std::vector<char> a = x.data(); // copy std::vector<char> b = f().data(); // move
于 2011-01-08T10:47:29.027 回答
7
例如,如果您愿意,可以将运算符重载为具有右值引用的自由函数:
Foo operator+(Foo&& a, const Foo& b)
{
a += b;
return std::move(a);
}
要使用成员函数达到相同的效果,您需要引用的提案:
Foo Foo::operator+(const Foo& b) && // note the double ampersand
{
*this += b;
return *this;
}
双 & 表示“这个成员函数只能在右值上调用”。
在此讨论您是否必须显式地从*this
此类成员函数中移出。
于 2011-01-08T10:40:26.863 回答