从unique_ptr 到unique_ptr

问题描述 投票:6回答:2

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 charShould `unique_ptr< T const [] >` accept a `T*` constructor argument?的显式转换也不起作用。

是否有更好的习语来实现我上面概述的内容?我的代码看起来很笨拙,而且考虑到一开始听起来很简单,所以很冗长。

将unique_ptr 移到unique_ptr 的最佳习惯是什么?用例:假设您在某个缓冲区中创建一个C字符串。为了确保在发生异常的情况下进行适当的清理,...

c++ c++11 const unique-ptr
2个回答
7
投票

VS2010和VS2012的stdlib允许使用res = std::move(buf)作为扩展名和对DR2118的响应进行转换。 libc ++和GCC 4.8的libstdc ++也是如此。

对于GCC 4.7,您不会绕过const_cast,但是至少可以稍微缩短行:


1
投票

Boost的Smart Ptr库具有通用的指针强制转换函数,该函数可与该库以及STL的智能指针一起使用。特别是const_pointer_cast可以满足您的需求:

© www.soinside.com 2019 - 2024. All rights reserved.