Taking a simple example:
_bstr_t smartString(L"MyString");
Process(smartString); // takes BSTR.
Initially I thought _bstr_t has a BSTR operator converting from _bstr_t to BSTR, but looking at msdn there is no such operator defined.
How does it work when passign _bstr_t to BSTR parameter or _variant_t to VARIANT?
BSTRistypedefed to beWCHAR*(wtypes.h file) and the latter istypedefed to bewchar_t*(winnt.h file) and_bstr_thasoperator wchar_t*()member variable. So the compiler just uses that operator for conversion.