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_ptrdefault constructor初始化指向0的指针:

explicit auto_ptr( X* p = 0 );

因此 get() 将在默认构造的 std::auto_ptr.

上有效地 returns "0"

std::auto_ptr<std::string> p;

调用 the constructor

explicit auto_ptr (X* p=0) throw();

将内部指针初始化为0。

因此,这取决于您所说的 "has not been initialized" 是什么意思。如您所示,调用默认 ctor 将产生一个 get 即 returns 0。同时将其初始化为其他内容,然后调用 reset(0),将产生一个 get 即 returns 0.

auto_ptrget 方法没有前置条件。

这意味着,无论 auto_ptr 对象处于什么状态,调用该方法总是安全的。

将此与 operator* 成员函数进行对比,后者确实具有 get() != 0 的前提条件。 C++ 标准在 Requires 子句中指定成员函数的前提条件。如果一个函数没有这样的子句,调用总是安全的。