【问题标题】:Printing unique_ptr to cout将 unique_ptr 打印到 cout
【发布时间】:2017-06-27 09:03:54
【问题描述】:

无法理解为什么会失败?

int *p = new int(10);
std::unique_ptr<int> ptr(p);
// Below line gives compilation error.
std::cout << "Value of ptr        " << ptr << std::endl;
// Below line works well.
std::cout << "Value pointed ptr   " << *ptr << std::endl;
std::cout << "Value of ptr->get() " << ptr.get() << std::endl;

我是这样理解的:

说p的地址是100,新分配的内存地址是200。

p                new allocated memory
----------       ---------
   200              10
----------       ---------
100              200


ptr
----------
   200
----------
300

在上面的描述中,unique_ptr 指向新分配的内存本身,避免了'p'。那么,打印'ptr'不应该给我200吗?

【问题讨论】:

    标签: c++ c++11 iostream smart-pointers unique-ptr


    【解决方案1】:
    std::unique_ptr<int> ptr(p);
    // Below line gives compilation error.
    std::cout << "Value of ptr        " << ptr << std::endl;
    

    为了能够使用通常的&lt;&lt; 语法来打印使用cout 的某个类的对象,必须实现operator&lt;&lt; 的适当重载。

    例如,如果你有一个类 X,如果你想启用cout &lt;&lt; x 语法,你可以像这样重载operator&lt;&lt;

    #include <ostream> // for std::ostream
    
    std::ostream& operator<<(std::ostream& os, const X& x)
    {
      // Implement your output logic for 'x'
      ...
    
      return os;
    }
    

    C++ 标准库设计者选择不为std::unique_ptr 实现这样的重载;这就是当您尝试将&lt;&lt;unique_ptrs 的实例一起使用时出现编译错误的原因。

    【讨论】:

      【解决方案2】:

      那么,打印 'ptr' 不应该给我 200 吗?

      如果指定的标准库 std::unique_ptr 应该可以流式传输到标准流中,它应该。换句话说,应该存在 operator &lt;&lt;std::unique_ptr 的重载。

      但是,标准没有规定这样的事情,因此流式传输 unique_ptr 会导致编译错误(没有 operator &lt;&lt; 接受它)。解决方案如您所见:如果您需要流式传输指针,请获取指针:

      stream << ptr.get()
      

      【讨论】:

      • 哦。有道理。购买阻止 C++ 社区超载的东西
      • @HemantBhargava :不需要。 C++ 标准已经太大了(*),添加几乎没人会使用的东西会使它变得更大。 *:不,我没有关于删除什么的好建议。
      • @MartinBonner 至于细化建议,我想到了std::vector&lt;bool&gt;
      • 我不认同“C++ 已经太大”的说法。我实际上记得一些 C++ 会议,他们将 C++ 标准库与更大的 .NET Framework 进行了比较。总是有空间向标准库添加方便的东西。总而言之,我们可以简单地打印 std::strings 而无需调用 .c_str();对我来说,只打印一个 unique_ptr 就像普通指针一样,而不调用 .get() 是有意义的。
      • @Mr.C64 我也不同意将标准“太大”作为不添加内容的主要论据。但是,与您的示例有一个根本区别:流式字符串是比流式智能指针更常见的操作,std::string 中的 流在语义上与 c_str() 的流式不同,因为可能包含NUL 个字符。
      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 2013-01-29
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多