移動語義--std::move
編譯器只對右值引用才能呼叫轉移建構函式和轉移賦值函式,而所有命名物件都只能是左值引用,如果已知乙個命名物件不再被使用而想對它呼叫轉移建構函式和轉移賦值函式,也就是把乙個左值引用當做右值引用來使用,怎麼做呢?標準庫提供了函式 std::move,這個函式以非常簡單的方式將左值引用轉換為右值引用。
對於右值引用而言,它本身是右值麼? 要看情況。
a. 字串的定義
string.cc
1 #include2 #include34class
string512
13 string(const
char *pstr)
1419
20 string(const string &rhs) //
複製建構函式
2126
27 string(string &&rhs) //
移動建構函式,移動就意味著修改,所以不加const。當發現是右值時,會優先繫結移動建構函式。
28: pstr_(rhs.pstr_)
2933
34 string &operator=(string &&rhs) //
移動賦值運算子函式
3543
return *this;44
}4546 string &operator=(const string &rhs) //
賦值運算子函式
4755
return *this;56
}5758 string & operator += (const string &rhs)
5968
69 ~string()
7077
78 friend std::ostream &operator
<<(std::ostream &os, const string &rhs);
79private:80
char *pstr_;
81};
8283 string operator + (const string &lhs, const string &rhs)
8491
92 string operator+(const string &lhs, const
char *rhs)
93100
101 string operator+(const
char *lhs, const string &rhs)
102109
110 std::ostream &operator
<<(std::ostream &os, const string &rhs)
111115
116string getstr()
117122
123int main(void
)124
std_move.cc
1 #include2 #include34class
metadata512
13 metadata(const metadata &other)
14:name_(other.name_), size_(other.size_)
1518
19 metadata(metadata &&other) //
移動建構函式 , 不加const
20//
: name_(other.name_)
//std::string 的複製建構函式
21: name_(std::move(other.name_)), size_(other.size_)
2225
26 std::string getname() const
2730
31int getsize() const
3235
36private
:37 std::string
name_;
38int
size_;
39};
4041
class
4249
n)51 : pvals_(new
int52
5557 : pvals_(new
int[other.metadata_.getsize()]), metadata_(other.metadata_)
5864}65
移動建構函式 , 不加const
67: pvals_(other.pvals_),
68//
metadata_(other.metadata_)
本身是乙個左值,會呼叫metadata類的複製建構函式,與這裡的初衷有相違背的地方,外層是移動構造,內層也得是移動構造,這種語義才算正常,要不然不是真正的移動構造語義。所以要換成 移動構造。
69 metadata_(std::move(other.metadata_)) //
這裡會呼叫metadata的移動建構函式。
7074
7680
81private:82
int *pvals_;
83metadata metadata_;
84};
8586
int main(void)87
C 11右值引用和std move語句例項解析
關鍵字 c 11,右值引用,rvalue,std move,vs 2015 os windows 10 右值引用 及其支援的move語意和完美 是c 0x加入的最重大語言特性之一。從實踐角度講,它能夠完美解決c 中長久以來為人所詬病的臨時物件效率問題。從語言本身講,它健全了c 中的引用型別在左值右值...
c 11 移動語義
右值是相對於左值而言的。簡單來說,在等號左邊的叫做左值,等號右邊的叫做右值。再具體點說,左值是值能夠取位址的值,比如我們定義的變數這些都是能夠賦值並且能夠取位址的。而右值是不能夠取位址的,比如常量 hello 或者乙個臨時變數。在c 11之前我們如何實用右值呢?通常是使用常引用,const type...
c 11 移動語義
c 已經擁有了拷貝建構函式,和賦值函式,它們主要定位為淺和深度拷貝,新增加乙個移動建構函式,主要避免拷貝構造。在定義了移動建構函式的情況下,在實參 argument 是乙個右值 rvalue,包括xvalue和prvalue 的情況下會呼叫移動建構函式,而不是呼叫複製建構函式 可以使用std mov...