2012-12-21 53 views
4

當我閱讀一些文章時,我發現這條線是如此神祕。如何使用新的語法

new (new_ptr + i) T(std::move(old_ptr[i])); 

有人可以解釋這種語法是如何工作的嗎?

+2

當然,在你閱讀了一個好的C++ 11教程後,仍然還沒有理解它。 – 2012-12-21 17:42:08

+6

這是新的位置,並不是新的C++ 11 – inf

+0

可能值得一提的是'new T(rhs)'是(並且總是)與'new(:: operator new(sizeof(T) )T(rhs)' –

回答

6

它的位置。

new (new_ptr + i) T(std::move(old_ptr[i])); 

在這裏我們可以簡化這個到:

new (<destinationLocation>) T(<constructor parameters); 

這是normall C++ 03,基本上可以讓你在你已經預分配的內存區域動態創建一個對象(其一種大多數人不會使用的先進技術(除非他們正在像對象一樣構建自己的容器))。

在std ::移動()的部分是從C++ 11並創建allowes移動構造在類型T中使用的特殊引用類型

new T(std::move(<source Obj>)); 

這基本上說創建一個新T使用源對象並使用移動構造函數來提高效率。這意味着'源Obj'將在移動後保持未定義狀態(因此不可用),但它允許高效的對象創建。

將兩者結合使用,您可以使用數組中的元素作爲源對象來獲得移動構建的新位置。

12

好吧,好消息是,它們都不是新的語法(但它全部是new語法,ho ho!)。有一個在C++ 11,std::move中引入的函數,但就是這樣。

該行的語法被稱爲放置new並且已經有很長一段時間了。它允許您在內存中已經分配了空間的某些處創建對象。這裏,已經分配的內存由指針new_ptr + i給出。正在創建的對象的類型是T

放置新的簡單和無意義的例子是:

int* p = new int(); // Allocate and initialise an int 
new (p) int(); // Initialise a new int in the space allocated before 

T構造被傳​​遞std::move(old_ptr[i])。假設old_ptr點在T類型的對象上,此移動允許使用移動構造函數T來創建該對象。它基本上假設old_ptr[i]是一個臨時的T對象(即使它實際上可能不是),允許新的T從中竊取。要了解更多信息,請查閱move semantics