簡體   English   中英

來自 unique_ptr<char[]> 到 unique_ptr<const char[]>

[英]from unique_ptr<char[]> to unique_ptr<const char[]>

unique_ptr<char[]>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的顯式轉換也不起作用,如“unique_ptr< T const [] >”是否應該接受“T*”構造函數參數中所述?

有沒有更好的成語來實現我上面概述的內容? 我的代碼看起來很笨拙,而且考慮了這個概念最初聽起來是多么簡單而冗長。

VS2010 和 VS2012 的 stdlib 允許使用res = std::move(buf)作為擴展和對DR2118的響應進行轉換 libc++ 和 GCC 4.8 的 libstdc++ 也是如此。

對於 GCC 4.7,您不會繞過const_cast ,但至少您可以稍微縮短該行:

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

Boost 的Smart Ptr庫具有通用的指針轉換函數,可以處理來自該庫和來自 STL 的智能指針。 特別是, const_pointer_cast可以做你需要的:

#include <boost/pointer_cast.hpp>

// ...
res = boost::const_pointer_cast<const char[]>(std::move(buf));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM