auto_ptr 未初始化时 get() 是否可靠?
Is get() reliable when an auto_ptr is uninitialized?
考虑以下代码:
std::auto_ptr<std::string> p;
if (p.get() == 0) {
...
}
get()
成员函数是否是检查 p
是否未初始化的标准且可靠的方法?无论平台、编译器、编译器的优化标志等如何,它总是 return 0 吗?
不存在未未初始化std::auto_ptr
,default constructor初始化指向0
的指针:
explicit auto_ptr( X* p = 0 );
因此 get()
将在默认构造的 std::auto_ptr
.
上有效地 returns "0
"
行
std::auto_ptr<std::string> p;
explicit auto_ptr (X* p=0) throw();
将内部指针初始化为0。
因此,这取决于您所说的 "has not been initialized" 是什么意思。如您所示,调用默认 ctor 将产生一个 get
即 returns 0。同时将其初始化为其他内容,然后调用 reset(0)
,将产生一个 get
即 returns 0.
auto_ptr
的 get
方法没有前置条件。
这意味着,无论 auto_ptr
对象处于什么状态,调用该方法总是安全的。
将此与 operator*
成员函数进行对比,后者确实具有 get() != 0
的前提条件。 C++ 标准在 Requires 子句中指定成员函数的前提条件。如果一个函数没有这样的子句,调用总是安全的。
考虑以下代码:
std::auto_ptr<std::string> p;
if (p.get() == 0) {
...
}
get()
成员函数是否是检查 p
是否未初始化的标准且可靠的方法?无论平台、编译器、编译器的优化标志等如何,它总是 return 0 吗?
不存在未未初始化std::auto_ptr
,default constructor初始化指向0
的指针:
explicit auto_ptr( X* p = 0 );
因此 get()
将在默认构造的 std::auto_ptr
.
0
"
行
std::auto_ptr<std::string> p;
explicit auto_ptr (X* p=0) throw();
将内部指针初始化为0。
因此,这取决于您所说的 "has not been initialized" 是什么意思。如您所示,调用默认 ctor 将产生一个 get
即 returns 0。同时将其初始化为其他内容,然后调用 reset(0)
,将产生一个 get
即 returns 0.
auto_ptr
的 get
方法没有前置条件。
这意味着,无论 auto_ptr
对象处于什么状态,调用该方法总是安全的。
将此与 operator*
成员函数进行对比,后者确实具有 get() != 0
的前提条件。 C++ 标准在 Requires 子句中指定成员函数的前提条件。如果一个函数没有这样的子句,调用总是安全的。