Implicit conversions occur when expressions have mixed types or function arguments do not match the function prototype. The compiler first tries a trivial conversion, then promotion, then a built-in type conversion, then a user-defined conversion, generating an error if none match. User-defined conversions are checked to see if the type needed has a defined conversion and if the supplied type matches or can be promoted. At most one built-in and one user-defined conversion will be applied. Explicit conversions occur when a cast is used, creating a temporary object that is destroyed after the statement.