2013-02-14 118 views
6

unique_ptr<char[]>移動到unique_ptr<const char[]>的最佳用法是什麼?from unique_ptr <char[]> to unique_ptr <const char []>

用例:假設您在某個緩衝區中創建了一個C字符串。爲確保在發生異常時進行適當的清理,該緩衝區可以是使用unique_ptr的引用。一旦字符串被構建,您可能需要將其移動到某個類成員,該成員被聲明爲unique_ptr<const char[]>以避免進一步修改該字符串。

這裏是最好的我到目前爲止:

std::unique_ptr<const char[]> res; 
std::unique_ptr<char[]> buf(new char[4]); 
buf[0] = 'f'; 
buf[1] = buf[2] = 'o'; 
buf[3] = '\0'; 
res = std::unique_ptr<const char[]>(const_cast<const char*>(buf.release())); 

簡單的移動似乎並沒有工作,可能是由於不同類型的刪除者。即使略去charconst char明確投不工作,在Should `unique_ptr< T const [] >` accept a `T*` constructor argument?

討論有沒有更好的成語來實現我上面列出?我的代碼看起來非常笨拙,而且相當冗長,這個概念起初聽起來有多簡單。

+0

只使用'解析度=的std ::移動(BUF);'我正常編譯在VS2010和VS2012和Clang中繼(使用libC++中繼)。但GCC 4.7.2扼流圈。 – Xeo 2013-02-14 11:26:14

+1

看來GCC 4.8 trunk修復了這個問題,你也可以使用'res = std :: move(buf)'。否則,我認爲你不能繞過這個演員。儘管如此,你可以將行縮短爲'res.reset(const_cast (buf.release()));'。 – Xeo 2013-02-14 11:34:54

+0

@Xeo,GCC 4.8上的信息和使用'reset'的較短成語都非常有價值。請張貼他們作爲答案。 – MvG 2013-02-14 11:36:30

回答

6

VS2010和VS2012的stdlib允許使用res = std::move(buf)作爲擴展和作爲對DR2118的響應進行轉換。 libC++和GCC 4.8的libstdC++也一樣。

對於GCC 4.7,你不會得到const_cast左右,但ATLEAST可以縮短有些行:

res.reset(const_cast<char const*>(buf.release()));