2014-09-12 72 views
14

我擔心在內核域中,我將無法訪問諸如std::move,std::forward,std::initializer_list等等。雖然這些功能中的一些內置於語言中,但仍需要適當的頭文件和庫實現。以下是足夠利用移動語義,還是我需要去整個九碼和端口一個C++庫?我需要將std :: move移植到我的內核嗎?

template <typename T> 
typename remove_reference<T>::type&& move(T&& arg) 
{ 
    return static_cast<typename remove_reference<T>::type&&>(arg); 
} 
+6

獨立實現應該仍然有''(並且它不是你可以自己編寫的東西,因爲它與編譯器實現密切相關)。 'std :: move'和'std :: forward'你可能需要自己編寫代碼,但它們只是美化演員。移動語義需求(1)編譯器支持和(2)移動感知類型。如果使用C++ 03'std :: vector'實現,即使使用'std :: move'和C++ 11編譯器,也不會獲得移動語義。 – 2014-09-12 22:24:28

+0

@ T.C。謝謝(你的)信息。 – Rigby 2014-09-12 22:32:02

+0

對於os-dev來說+1,就像我做的那樣> o < – ikh 2014-09-12 22:44:51

回答

1

這應該這樣做,假設沒有錯別字。完整的定義在標準中給出(實際上是兩個;新舊),我已經完成了:只是將正式版本複製到我自己的標題中,然後解決我的特殊要求和/或支持舊gnu std lib但編譯器groks右值引用。

爲了解決@ T.C.的問題,能夠編寫我自己的僅移動類型並能夠使用它們,例如從函數返回,即使提供的容器不知道它。 Boost容器類,如果你提供了所有std :: move,std :: forward以及它所需要的東西,你可以覆蓋配置來告訴Boost你有& &。爲了與通常配置的Boost編譯的代碼兼容,我還採用了使用原生rvalue引用和Boost移動仿真同時工作的混合方法。

相關問題