將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()));
簡單的移動似乎並沒有工作,可能是由於不同類型的刪除者。即使略去char
到const char
明確投不工作,在Should `unique_ptr< T const [] >` accept a `T*` constructor argument?
討論有沒有更好的成語來實現我上面列出?我的代碼看起來非常笨拙,而且相當冗長,這個概念起初聽起來有多簡單。
只使用'解析度=的std ::移動(BUF);'我正常編譯在VS2010和VS2012和Clang中繼(使用libC++中繼)。但GCC 4.7.2扼流圈。 – Xeo 2013-02-14 11:26:14
看來GCC 4.8 trunk修復了這個問題,你也可以使用'res = std :: move(buf)'。否則,我認爲你不能繞過這個演員。儘管如此,你可以將行縮短爲'res.reset(const_cast(buf.release()));'。 –
Xeo
2013-02-14 11:34:54
@Xeo,GCC 4.8上的信息和使用'reset'的較短成語都非常有價值。請張貼他們作爲答案。 – MvG 2013-02-14 11:36:30