C 移動語義 std move 例項解析

2022-08-10 02:27:21 字數 2761 閱讀 9277

移動語義--std::move

編譯器只對右值引用才能呼叫轉移建構函式和轉移賦值函式,而所有命名物件都只能是左值引用,如果已知乙個命名物件不再被使用而想對它呼叫轉移建構函式和轉移賦值函式,也就是把乙個左值引用當做右值引用來使用,怎麼做呢?標準庫提供了函式 std::move,這個函式以非常簡單的方式將左值引用轉換為右值引用。

對於右值引用而言,它本身是右值麼? 要看情況。

a. 字串的定義

string.cc

1 #include2 #include34

class

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 #include34

class

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...