我想了解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()==*p
而std::cout << p << '\n';
无法编译?
我正在工作on g++ -std=c++11 -O2 -Wall -pedantic
。
答案 0 :(得分:7)
为什么
&p
和p.get()
会产生不同的结果?
&p
是scoped_ptr
对象的地址。 p.get()
是其指向的int
对象的地址。
为什么
*p.get()==*p
而std::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())