C 11移動語義之一(基本概念)

2022-09-12 00:06:25 字數 1063 閱讀 6909

移動語義是c++11的新特性之一,利用移動語義可以實現物件的移動而非拷貝。在某些情況下,可以大幅度的提公升效能。本文將介紹c++11移動語義中的一些基本概念。

表示式是由乙個或者多個運算物件組成,對表示式求值將得到乙個結果,字面值和變數是最簡單的表示式,其結果就是字面值和變數的值。把乙個運算子和乙個或者多個運算物件組合起來可以生成較為複雜的表示式。

classa;

//a為左值

a a;

//geta函式返回右值

a geta()

void

seta(a a)

//實參a()為右值

seta(a())

引用:變數的別名。有以下要點:1)對引用的操作與對變數的操作是完全一樣的;2)定義引用的時候必須進行初始化,而且不能繫結到其他物件上去。

左值引用:常規引用,只能繫結到左值上(有的編譯器可以繫結到右值,見下文例子)。

右值引用:必須繫結到右值的引用。由於右值通常是被臨時建立、即將被銷毀的物件,所以右值引用可以延長右值的生命週期,直到右值引用型別的變數超出作用域,右值引用型別的變數在銷毀的同時,被引用的右值也一併銷毀。

這裡請注意:變數的型別和變數本身是左值還是右值沒有關係(只要是變數,就都是左值,因為其有名字,可以取位址。)例如:不能將右值引用繫結到右值引用型別的變數,這很奇怪,但是實際確實如此:

//

a為右值引用型別的變數

a&& a =geta();

//錯誤,a為左值,不能將左值繫結到右值引用上

a&& b = a;

上文提到有的編譯器可以將右值繫結到左值引用上面,在vs2015中,

//vs

2015中沒有報錯,將右值繫結到左值引用上面

a& a = geta();

在g++5.3.1,上述**會報錯,不能將右值繫結到左值引用上面。

可見,對於右值繫結到左值引用上面,不同的編譯器的要求是不一樣的,可以不必過分關注這些細節問題。右值最重要的使用場景是物件的移動,接下來的文章會進行介紹。

c++ primer(第5版)

c 11 移動語義

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

c 11 移動語義

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

移動語義和右值引用(C 11)

左值 可以取位址 有名字的 右值 不能取位址 沒名字的 傳統的c 引用稱為左值引用,使得標誌符關聯到左值。c 11新增了右值引用,使用 表示。引入右值引用的主要目的之一是實現移動語義。在複製物件時,實現物件的移動而非拷貝。通過移動建構函式 移動賦值運算子實現 函式的引數為右值引用,函式內部並非深度複...