Which is the better way to return a new instance of a boost intrusive_ptr
When in doubt, be explicit.  While both of the functions given will work, the second expresses programmer intent more clearly.  Adding a comment along the lines of "This will call intrusive_ptr's implicit constructor" to the first can help, though at that point it's more concise to call the constructor directly.  Returning a raw pointer and relying on the implicit constructor for intrusive_ptr may also be viewed as a mistake introduced by changing the declaration of MyFactory() but forgetting its definition.  Relying on implicit constructors may also make the code harder to debug and maintain because by default, the constructor for intrusive_ptr increments the retain count in Foo.  Calling it explicitly gives you the benefit of being able to search for "FooPtr(" when trying to track down every place a Foo is  retained.  Also, if the Foo constructor initializes its retain count to 1, you may be introducing a memory leak by relying on the implicit constructor.  Explicitly specifying FooPtr(new Foo(a, b, c), false) would prevent this.