请考虑以下代码:
std::auto_ptr<std::string> p;
if (p.get() == 0) {
...
}
get()
成员函数是否是检查p
尚未初始化的标准且可靠的方法?它是否总是返回0,不管平台,编译器,编译器的优化标志等等?
答案 0 :(得分:11)
没有未初始化std::auto_ptr
,default constructor初始化指向0
的指针:
explicit auto_ptr( X* p = 0 );
因此get()
将有效地返回&#34; 0
&#34;在默认构造的std::auto_ptr
上。
答案 1 :(得分:3)
该行
std::auto_ptr<std::string> p;
explicit auto_ptr (X* p=0) throw();
将内部指针初始化为0。
因此,它取决于你所说的“尚未初始化”。如您所示,调用默认的ctor将产生返回0的get
。同时将其初始化为其他内容,然后调用reset(0)
,将产生返回0的get
答案 2 :(得分:1)
get
的{{1}}方法没有先决条件。
这意味着,无论auto_ptr
对象处于什么状态,调用该方法总是安全的。
将此与auto_ptr
成员函数进行对比,该函数的前提条件为operator*
。 C ++标准为 Requires 子句中的成员函数指定了前提条件。如果函数没有这样的子句,则可以安全地调用。