Q
如何使用新的語法
4
A
回答
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。
相關問題
- 1. 如何使用Ruby的新lambda語法?
- 2. 使用新型的語法
- 3. 如何使用mysql語法使用codeigniter表更新,如條件?
- 4. 使用新文本語法
- 5. 如何使用GetComponent-語法
- 6. 如何使用PHP語法
- 7. 如何使用Mojolicious模板中的新語法功能
- 8. 如何使用新的Scala語法重寫「TowersOfHanoi」
- 9. 如何使用定義的語法
- 10. 如何正確使用RAND()的語法()
- 11. 如何更新C#中的srgs語法
- 12. 如何用新的語法樹部分更新編譯?
- 13. 如何使用ControllerAs語法手動更新AngularJS視圖?
- 14. 如何使用mysql IN語句和wpdb更新方法?
- 15. 如何使用Eloquent fluent語法在加入後更新記錄?
- 16. 如何用新的rspec語法測試模型方法?
- 17. 使用CTE更新 - 語法錯誤?
- 18. 使用新格式語法打印{和}
- 19. 使用多表語法進行更新
- 20. 使用php oci更新sql語法
- 21. 更新表使用PDO:語法錯誤
- 22. 使用新機器後語法錯誤
- 23. 如何使用Javac打印語法樹
- 24. 如何使用X:Bind語法獲取BindingExpression?
- 25. CSS語法,如何使用li.class:hover?
- 26. 如何使用Excel建立SQL語法
- 27. 如何在JavaScript中使用HTML語法?
- 28. 如何使用es6語法導入ReactCSSTransitionGroup?
- 29. 如何使用「點語法」玉
- 30. 如何使用bjam語法配置Boost.Python?
當然,在你閱讀了一個好的C++ 11教程後,仍然還沒有理解它。 – 2012-12-21 17:42:08
這是新的位置,並不是新的C++ 11 – inf
可能值得一提的是'new T(rhs)'是(並且總是)與'new(:: operator new(sizeof(T) )T(rhs)' –