【问题标题】:from unique_ptr<char[]> to unique_ptr<const char[]>从 unique_ptr<char[]> 到 unique_ptr<const char[]>
【发布时间】:2013-01-30 04:20:51
【问题描述】:

unique_ptr&lt;char[]&gt; 移动到unique_ptr&lt;const char[]&gt; 的最佳习语是什么?

用例:假设您在某个缓冲区中创建了一个 C 字符串。为了确保在发生异常时进行适当的清理,可以使用unique_ptr 引用该缓冲区。构造字符串后,您可能希望将其移动到某个类成员,该成员声明为 unique_ptr&lt;const char[]&gt;,以避免进一步修改字符串。

这是我迄今为止最好的:

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? 中所述

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

【问题讨论】:

  • 使用 res = std::move(buf); 在 VS2010 和 VS2012 以及 Clang 主干(使用 libc++ 主干)中对我来说编译得很好。不过,GCC 4.7.2 对此感到窒息。
  • 看来 GCC 4.8 主干解决了这个问题,你也可以在那里使用res = std::move(buf)。否则,我认为你无法绕过这个演员阵容。不过,您可以将该行缩短为 res.reset(const_cast&lt;char const*&gt;(buf.release()));
  • @Xeo,关于 GCC 4.8 的信息和使用 reset 的较短成语都非常有价值。请将它们作为答案发布。
  • 我知道一种更好的方法:使用std::string。只是不要复制它,它会很好地移动。
  • @NicolBolas:我正在组装std::exception::what() 的覆盖的返回值,它必须是const char*。我在std::string 上完成了大部分工作,所以buf 是我分配给的字符数组,res 是我用来保持结果有效的成员,直到异常本身被收集。我想我可以改为返回std::string::c_str() 的结果,我猜。但是不能强制让类不操纵该字符串,因为没有可以分配但不能就地修改的std::string。这使得我在这里的整个问题不适用。

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


【解决方案1】:

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()));

【讨论】:

    【解决方案2】:

    Boost 的Smart Ptr 库具有通用的指针转换函数,可以使用该库中的智能指针以及 STL 中的智能指针。特别是const_pointer_cast 可以做你需要的:

    #include <boost/pointer_cast.hpp>
    
    // ...
    res = boost::const_pointer_cast<const char[]>(std::move(buf));
    

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多