从unique_ptr <char []>到unique_ptr <const char [] =“”> </const> </char []>

时间:2013-02-14 11:17:14

标签: c++ c++11 const unique-ptr

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的明确演员也行不通,正如Should `unique_ptr< T const [] >` accept a `T*` constructor argument?

中所讨论的那样

有没有更好的成语来实现我上面概述的内容?我的代码看起来非常笨拙而且考虑到概念听起来有多么简单。

2 个答案:

答案 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));