6

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()));

おそらく削除者の種類が異なるため、単に移動するだけではうまくいかないようです。`unique_ptr <T const[]>`が`T*`コンストラクタ引数を受け入れるべきかcharで説明されているように、 toからの明示的なキャストを省略してもconst char機能しません。

上で概説したことを達成するためのより良いイディオムはありますか?私のコードはかなり不器用に見え、最初は概念がいかに単純に聞こえるかを考えるとかなり長いです。

4

2 に答える 2

8

VS2010およびVS2012のstdlibでは、拡張機能として、およびDR2118res = std::move(buf)への応答としての変換が可能です。libc++とGCC4.8のlibstdc++についても同じことが言えます。

GCC 4.7の場合、回避することはできませんがconst_cast、少なくとも行をいくらか短くすることができます。

res.reset(const_cast<char const*>(buf.release()));
于 2013-02-14T11:43:53.523 に答える
1

BoostのSmartPtrライブラリには、STLからのスマートポインタだけでなく、そのライブラリからのスマートポインタと連携する汎用ポインタキャスト関数があります。特に、const_pointer_cast必要なことを実行できます。

#include <boost/pointer_cast.hpp>

// ...
res = boost::const_pointer_cast<const char[]>(std::move(buf));
于 2020-01-02T16:15:45.470 に答える