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()==*p
而 std::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?
&p
是scoped_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())
相同
我正在尝试理解 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
。
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
andp.get()
produce different results?
&p
是scoped_ptr
对象的地址。 p.get()
是它指向的 int
对象的地址。
Why is
*p.get()==*p
and yetstd::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
. 的条件表达式中给出类似布尔的答案
[= 定义流运算符46=]cout << p
失败,因为没有为 scoped_ptr< T >.*p
存在是因为定义了一个一元运算符*,其结果与*(p.get())
相同