#include
using
namespace std;
classa~
a()// 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a(
const a& a)
:m_ptr
(new
int(
*a.m_ptr)
)// 通過移動構造,a&&作為函式引數,只使用淺拷貝避免臨時物件的拷貝
a(a&& a)
:m_ptr
(a.m_ptr)
private
:int
* m_ptr;};
// get函式中存在通過乙個臨時變數拷貝構造了乙個新的物件返回,臨時變數在拷貝構造完成之後就銷毀了,因此會帶來額外的效能損耗。
a get()
intmain()
std::move語義就是將左值轉換為右值,將物件的狀態或者所有權從乙個物件轉移到另乙個物件,並且只是轉移沒有記憶體拷貝。
例如容器的拷貝,如果使用move語義可以避免物件的拷貝。
std::list tokens;
std::list t = std::
move
(tokens)
;
void
processvalue
(int
& i)
void
processvalue
(int
&& i)
intmain()
右值引用還適用於這樣的場景:需要將一組引數原封不動的傳遞給另乙個函式
std::forward語義,如果乙個右值引用做為函式的引數,在函式內部在**該引數的時候就會又變成乙個左值,c++11提供的forward就是為了解決這種問題,按照引數本身的型別而**。
int x =0;
decltype
(x) y =1;
decltype
(x+y) z =
2;
decltype多用於泛型程式設計當中
typedef
unsigned
int uint_t;
typedef的侷限在於無法重定義乙個模板,
例如有如下場景:
typedef std::mapint> map_int_t;
typedef std::map map_string_t;
typedef就需要定義兩次,如果使用using關鍵字就可以寫為:
template
<
typename v>
using str_map_t = std::map
;
《深入理解C 11》筆記 decltype
本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數 int main decltype的應用 一種是decltype和typedef using的合用 using size t decltype s...
《深入理解C 11》筆記 追蹤返回型別
templatedecltype 2 a doublevalue t a 用decltype推導返回型別但是對於編譯器來說,是從左到右進行編譯的,decltype在進行推導時並不知道a的型別,所以這種寫法是編譯不過的。為了解決這個問題,於是引入了追蹤返回型別 template auto double...
《深入理解C 11》筆記 強型別列舉
本篇開始介紹第五章的內容 強型別列舉。列舉enum的使用應該十分常見,用於定義同一類的資料。但是列舉其實存在一定的問題 enum male enum female 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...