6

unique_ptr<char[]>将 a 移动到 a的最佳成语是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 [] >` 应该char接受`T*` 构造函数参数吗?const char

有没有更好的成语来实现我上面概述的内容?我的代码看起来很笨拙,而且考虑到这个概念一开始听起来多么简单,我的代码相当冗长。

4

2 回答 2

8

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()));
于 2013-02-14T11:43:53.523 回答
1

Boost的Smart Ptr库具有通用的指针转换函数,可以使用该库中的智能指针以及 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 回答