Why is boost::optional::is_initialized() deprecated?

However, this would give wrong results if foo is a boost::optional or some other boost::optional where T is convertible to bool.

No, because there is no implicit conversion to the underlying type. The "truthiness"¹ of an optional always refers to its initialized state.

The only time you may have gotten the impression that implicit conversions happen is in relational operators. However, that's not doing implicit conversion to the underlying type, instead does lifting of the operators, explicitly.

¹ by which I mean contextual (explicit) boolean conversion

Update

Indeed for boost::optional<bool> there's the caveat in pre-c++11 mode:

Second, although optional<> provides a contextual conversion to bool in C++11, this falls back to an implicit conversion on older compilers

In that case it is clearly better to explicitly compare to boost::none.