将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()));
简单移动似乎不起作用,可能是由于不同的删除器类型。即使省略char
到const char
的明确演员也行不通,正如Should `unique_ptr< T const [] >` accept a `T*` constructor argument?
有没有更好的成语来实现我上面概述的内容?我的代码看起来非常笨拙而且考虑到概念听起来有多么简单。
答案 0 :(得分:6)
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()));
答案 1 :(得分:1)
Boost的Smart Ptr库具有通用的指针强制转换函数,可与该库中的智能指针以及STL中的智能指针一起使用。特别是,const_pointer_cast
可以满足您的需求:
#include <boost/pointer_cast.hpp>
// ...
res = boost::const_pointer_cast<const char[]>(std::move(buf));