boost :: scoped_ptr指针的值究竟是什么?

时间:2015-01-23 14:58:23

标签: c++ boost smart-pointers

我想了解boost::scoped_ptr的结构。让我们定义并写入标准输出scoped_ptr指针及其指向的值:

#include <boost/scoped_ptr.hpp>
#include <iostream>

int main()
{
  boost::scoped_ptr<int> p{new int{1}};

  std::cout << p.get() << '\n'; // ok
  std::cout << p << '\n';       // error   


  std::cout << *p.get() << '\n'; // ok
  std::cout << *p << '\n';       // ok. *p==*p.get()
}

问题。为什么*p.get()==*pstd::cout << p << '\n';无法编译?

我正在工作on g++ -std=c++11 -O2 -Wall -pedantic

3 个答案:

答案 0 :(得分:7)

  

为什么&pp.get()会产生不同的结果?

&pscoped_ptr对象的地址。 p.get()是其指向的int对象的地址。

  

为什么*p.get()==*pstd::cout << p << '\n';无法编译?

这两者是无关的。

*p被定义为与*p.get()相同:取消引用作用域指针访问它指向的对象,并且解引用指向同一对象的原始指针也是如此。

cout << p无法编译,因为<<没有超出流范围指针的重载。

  

我正在处理g++ -std=c++11 -O2 -Wall -pedantic

然后考虑std::unique_ptr(在C ++ 11中引入)而不是boost::scoped_ptr。它更标准,也可以移动。

答案 1 :(得分:1)

scoped_ptr或任何其他“智能指针”都是“像对象一样的指针”,而不是真正的指针。

这些智能指针实际上是对象,当然是&p,它获取指向这个“智能指针对象”的指针,不同于p.get(),这是一个方法返回指针“聪明”指针对象“持有。

*p.get()相当于*(p.get()),其中p.get()返回p持有的指针,*p相当于“p.operator *() “,这是一个重载的运算符,也返回p持有的指针,这就是为什么*p.get()==*p

cout << p无法编译,因为没有重载运算符将p输出到流。

答案 2 :(得分:1)

scoped_ptr的&LT; T&gt; 是模仿指针的模板类。该类的实例化将创建一个与指针具有相似行为的对象。

  • p.get返回类型T*的关联值的地址:因此它返回new int{1}返回的地址,即其成员中指向的值{关联指针。

  • &p返回对象 p 的地址(即 p 所在的位置)。 p 是一个容器,它有一个真正的指针成员,指向类型为T的相关值的地址。

  • p无法返回任何好内容,因为scoped_ptr< T >没有强制转换运算符可以通过设计选择将自身转换为T*。您必须使用 get 来实现此目的。但它应该在相当于p.get() != 0的条件表达式中给出类似bool的答案。

  • cout << p失败,因为没有为 scoped_ptr&lt;定义的流运算符T&gt;

  • *p存在,因为有一个定义的一元运算符*,其结果与*(p.get())

  • 相同