将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?的显式转换也不起作用。
是否有更好的习语来实现我上面概述的内容?我的代码看起来很笨拙,而且考虑到一开始听起来很简单,所以很冗长。
将unique_ptr
VS2010和VS2012的stdlib允许使用res = std::move(buf)
作为扩展名和对DR2118的响应进行转换。 libc ++和GCC 4.8的libstdc ++也是如此。
对于GCC 4.7,您不会绕过const_cast
,但是至少可以稍微缩短行:
Boost的Smart Ptr库具有通用的指针强制转换函数,该函数可与该库以及STL的智能指针一起使用。特别是const_pointer_cast
可以满足您的需求: