从unique_ptr <char []>到unique_ptr <const char []>

MvG*_*MvG 6 c++ const unique-ptr c++11

什么是移动unique_ptr<char[]>到最好的成语unique_ptr<const char[]>

使用案例:假设您在某个缓冲区中创建了一个C字符串.为了确保在异常的情况下正确清理,该缓冲区可以是使用a的引用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()));
Run Code Online (Sandbox Code Playgroud)

简单地移动似乎不起作用,可能是由于不同的删除器类型.即使省略显式强制char转换const char也不起作用,如在`unique_ptr <T const []>`中讨论的那样`接受`T*`构造函数参数?

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

Xeo*_*Xeo 7

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()));
Run Code Online (Sandbox Code Playgroud)