[英]C++ Move Assignment Operator Return Type
移動分配運算符的正確返回類型是什么?
const type&
要么
type&
?
又為什么呢? (我認為我不完全理解編譯器如何確定l / r / x值之間的關系。)
例如,考慮矢量類的實現。
函數可以返回向量。
vector myfunc()
{
vector v;
// add content to v
return v;
}
int main()
{
vector v2;
v2 = myfunc;
}
我們希望myfunc
返回[?]到期值[?],即; 我們希望調用移動分配運算符,而不是復制分配運算符。
復制分配運算符可能如下所示:
const Vector& operator=(const Vector& vector)
{
if(this != &vector)
{
if(m_capacity_x != vector.m_capacity_x)
{
delete [] m_data;
m_data = new T[vector.m_capacity_x];
}
m_size = vector.m_size_x;
m_capacity_x = vector.m_capacity_x;
std::copy(&(vector.m_data[0]), &(vector.m_data[vector.m_size_x - 1]), m_data);
}
return *this;
}
而移動分配運算符可能如下所示:
Vector& operator=(Vector&& vector)
{
m_data = vector.m_data;
m_size = vector.m_size;
m_capacity = vector.m_capacity;
m_data = nullptr;
m_size = 0;
m_capacity = 0;
return *this;
}
但是返回類型正確嗎? 應該是Vector&&
[是否存在嗎?]還是const Vector&
?
我們可以問,賦值給右值有什么意義? 賦值通常是在左值上完成的,因此應該返回該值。 另外,如果您的值最初是const,那么為什么要支持賦值? 否則,如果不是const,為什么要強制使用它?
因此,通常的情況是賦值運算符始終返回非常量左值。
通常,賦值運算符的返回類型是Vector&
,但是如果您不希望人們制作時髦的賦值鏈(((v1 = v2) = v3) = v4)
,則const Vector&
是可以接受的。 移動分配和復制分配都是“分配”。 一個賦值運算符的返回類型與另一個賦值運算符不同,這是出乎意料的,因此無論您選擇哪個,都應該堅持。
返回Vector&&
非常奇怪。 僅僅因為您使用了移動分配運算符,並不意味着您的對象在魔術上是一個右值。 您必須專門對其進行轉換,然后可能會意外地移出該實例。
void some_function(Vector);
Vector get_some_Vector();
Vector f;
some_function(f = get_some_Vector()); //oops f is empty now
我個人不熟悉“移動分配運算符”。 我與一些不支持c ++ 11的較舊的編譯器一起工作,但是文檔建議操作符應僅返回type&
。
http://en.cppreference.com/w/cpp/language/move_assignment
https://msdn.microsoft.com/zh-CN/library/dd293665.aspx
我只是在搜索c ++移動分配。
另外,在您的示例中,您沒有從運算符返回任何信息。 除非返回類型為空,否則您應該返回一些內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.