使用C 11移動複製

2021-07-29 06:13:04 字數 3061 閱讀 7482

製作乙個可移植的使用右值引用的類

c++11標準的最大功能之一是右值引用。此功能允許修改臨時物件,從它們那裡「偷」資源。在c++03中沒有有值引用,但使用boost.move庫,可以寫一些可移植的使用右值引用的**。

左值:乙個函式或者物件例項。

失效值:生命期即將結束的物件。

廣義左值:包括左值和失效值。

右值:包括失效值、臨時物件、以及不關聯物件的值。

純右值:非失效值的那些右值。

左右值鑑別最簡單的辦法:左值可以用取位址操作符」&「獲取位址,右值無法使用」&「。

例如:

int  x = 0;     //物件例項,有名,x是左值

int* p = &++x; //可以取位址,++x是左值

++x = 10; //前置++返回的是左值,可以賦值

p = &x++; //後置++操作返回乙個臨時物件,不能取位址或賦值,是右值,編譯錯誤

使用方法步驟:

#include 

#include

#include

#include

using

namespace

std;

namespace other ;

}struct person_info

person_info(const person_info& p)

:is_male_(p.is_male_)

,name_(p.name_)

,second_name_(p.second_name_)

,characteristic_(p.characteristic_)

{}// move constructot 移動建構函式

person_info(boost_rv_ref(person_info) person)

// move assignment 移動賦值函式

person_info& operator=(boost_rv_ref(person_info) person)

return *this;

}// copy assignment 複製賦值函式

person_info& operator=(boost_copy_assign_ref(person_info) person)

return *this;

}void swap(person_info& rhs)

};int main()

製作乙個不可複製的類

為乙個類提供乙個複製建構函式和移動賦值運算子將需要太多的工作,或因技術原因乙個類擁有一些絕對不可複製的資源:

例如,下面的例子:

class descriptor_owner

~descriptor_owner()

};int main()

boost::noncopyable可以避免這種情況,如果從它派生出你自己的類,c++編譯器將不會產生複製建構函式和賦值運算子:

#include 

class descriptor_owner_fixed : private boost::noncopyable

~descriptor_owner_fixed()

};int main()

當然,我們可以使descriptor_owner_fixed的複製建構函式和賦值運算子私有,或者只定義它們而沒有實現,也可以實現相同的結果。boost::noncopyable類目前正是這麼實現。

製作乙個不可複製但可移動的類

c++11提供了只可移動的(move-only)類(比如std::unique_ptr或std::thread)。採用這樣的方法,可以做乙個只可移動的descriptor_owner類:

class descriptor_owner1 : private boost::noncopyable

explicit descriptor_owner1(const

char* params) : descriptor_(_strdup(params)) {}

descriptor_owner1(descriptor_owner1&& param) : descriptor_(param.descriptor_)

descriptor_owner1& operator=(descriptor_owner1&& param)

void clear()

bool empty() const

~descriptor_owner1()

};descriptor_owner1 construct_descriptor2()

void foo_rv()

int main()

以上只能在c++11相容編譯器中工作。下面修改這個例子以便可用於c++03編譯器。

使用方法步驟:

#include 

#include

class descriptor_owner_movable

explicit descriptor_owner_movable(const

char* param)

:descriptor_(_strdup(param)) {}

descriptor_owner_movable(boost_rv_ref(descriptor_owner_movable) param)

:descriptor_(param.descriptor_)

descriptor_owner_movable& operator=(boost_rv_ref(descriptor_owner_movable) param)

void clear()

};descriptor_owner_movable construct_descriptor3()

int main()

c 11 移動語義

右值是相對於左值而言的。簡單來說,在等號左邊的叫做左值,等號右邊的叫做右值。再具體點說,左值是值能夠取位址的值,比如我們定義的變數這些都是能夠賦值並且能夠取位址的。而右值是不能夠取位址的,比如常量 hello 或者乙個臨時變數。在c 11之前我們如何實用右值呢?通常是使用常引用,const type...

c 11 移動語義

c 已經擁有了拷貝建構函式,和賦值函式,它們主要定位為淺和深度拷貝,新增加乙個移動建構函式,主要避免拷貝構造。在定義了移動建構函式的情況下,在實參 argument 是乙個右值 rvalue,包括xvalue和prvalue 的情況下會呼叫移動建構函式,而不是呼叫複製建構函式 可以使用std mov...

C 11 移動建構函式

移動建構函式是什麼?先舉個例子,你有一本書,你不想看,但我很想看,那麼我有哪些方法可以讓我能看這本書?有兩種做法,一種是你直接把書交給我,另一種是我去買一些稿紙來,然後照著你這本書一字一句抄到稿紙上。顯然,第二種方法很浪費時間,但這正是有些深拷貝建構函式的做法,而移動建構函式便能像第一種做法一樣省時...