13

In C++, I can write something like:

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

Why does if (a_sp) check work correctly? a_sp is not a boolean, but how is it checked for true or false? How does the if condition know to check the result of a_sp.get() function? Or if it does not, how is the NULLity of the a_sp checked? Is there some function in shared_ptr defined that converts it to boolean value?

2 Answers 2

15

shared_ptr has an operator unspecified-bool-type() const that allows it to be used in boolean contexts. The unspecified-bool-type is typically defined as a pointer to function, or pointer to member-function, to disallow accidental matching to bool function overloads.

In C++0x the idiom is to use explicit operator bool() const;, which disallows implicit conversions (such as function calls, conversions to int for arithmetic, and so on), but still allows the shared_ptr to be converted to bool in boolean contexts.

Sign up to request clarification or add additional context in comments.

3 Comments

Mankarse: What is this syntax operator unspecified-bool-type(). I haven't seen this before. Is this something special to boost?
unspecified-bool-type is just a stand in for an actual type, such as bool. This syntax is not a special boost thing, it is the syntax for declaring a "type conversion operator". See wikibooks
Mankarse: Awesome. Thanks for the link.
2

shared_ptr has operator bool(), which returns true if it is not empty.

For example, this is Microsoft implementation of shared_ptr::operator bool(): http://msdn.microsoft.com/en-us/library/bb982901.aspx

shared_ptr::operator boolean-type - Tests if an owned resource exists.

1 Comment

That is only conceptually correct, but not actually: artima.com/cppsource/safebool.html; but it's to be fixed with explicit conversion operators: open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.