2011-08-29 56 views
10

shared_ptr的工作,在C++中,我可以写这样的:如何,如果条件

shared_ptr<A> a_sp = someFunctionReturningSharedPtr(); 
if (a_sp) { 
    cout << a_sp->someData << endl; 
} else { 
    cout << "Shared Pointer is NULL << endl; 
} 

为什么if (a_sp)检查工作是否正确? a_sp不是布尔值,但它是如何检查真或假? if条件知道如何检查a_sp.get()函数的结果?或者如果没有,检查a_spNULL如何?定义将shared_ptr中的某个函数转换为布尔值吗?

回答

14

shared_ptr有一个operator unspecified-bool-type() const允许它在布尔上下文中使用。 unspecified-bool-type通常被定义为指向函数的指针或指向成员函数的指针,以禁止意外匹配bool函数重载。

C++0x成语是使用explicit operator bool() const;,它不允许隐式转换(如函数调用,转换到int用于算术,等等),但仍允许shared_ptr要转换在布尔值的上下文为bool。

+0

Mankarse:这个语法是什么'operator unspecified-bool-类型()'。我以前没见过这个。这是什么特别的提升? –

+0

unspecified-bool-type仅代表实际类型,如bool。这个语法不是一个特别的提升,它是声明“类型转换运算符”的语法。查看[wikibooks](http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Conversion_operators) – Mankarse

+0

Mankarse:太棒了。感谢您的链接。 –

2

shared_ptr有operator bool(),如果它不为空则返回true。

例如,这是微软实施的shared_ptr ::运算布尔():http://msdn.microsoft.com/en-us/library/bb982901.aspx

的shared_ptr ::运算布尔型 - 如果所有的资源是否存在的试验。

+0

谢谢Alex。 –

+1

这只是概念上正确的,但实际上并非如此:http://www.artima.com/cppsource/safebool.html;但可以通过显式转换运算符来解决:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm –