boost::scoped_ptr 指针的值到底是多少?

What exactly is the value of a boost::scoped_ptr pointer?

我正在尝试理解 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

scoped_ptr 或任何其他 "smart pointers" 是 "pointer like objects" 而不是真正的指针。

这些智能指针其实都是对象,当然&p,它获取的是这个"smart pointer object"的指针,不同于p.get(),是一个方法returns "smart pointer object" 持有的指针。

*p.get()等同于*(p.get()),其中p.get()returnsp持有的指针,*p等同于"p.operator*()",这是一个重载运算符,也是 returns p 持有的指针,这就是 *p.get()==*p.

的原因

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

Why do &p and p.get() produce different results?

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

Why is *p.get()==*p and yet std::cout << p << '\n'; won't compile?

两者无关。

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

cout << p 无法编译,因为流作用域指针没有 << 的重载。

I'm working on g++ -std=c++11 -O2 -Wall -pedantic

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

scoped_ptr< T > 是模仿指针的模板 class。此 class 的实例化将创建一个与指针具有相似行为的对象。

  • p.get returns 类型关联值的地址 T*: 所以它 returns 地址 return由 new int{1} 编辑,这是其成员中指向关联指针的值。

  • &p return 对象的地址 p (即 p 居住)。 p 是一个容器,它有一个真正的指针成员,指向类型 T 的关联值的地址。

  • p 不能 return 任何好东西,因为 scoped_ptr< T > 没有强制转换运算符来根据设计选择将其自身转换为 T*。为此,您必须使用 get。但它应该在相当于 p.get() != 0.

  • 的条件表达式中给出类似布尔的答案
  • cout << p 失败,因为没有为 scoped_ptr< T >.

    [= 定义流运算符46=]
  • *p 存在是因为定义了一个一元运算符*,其结果与 *(p.get())

  • 相同