Code examples are a nice way to explain this, for handles.
In the following, a and b are handles. a has been initialized
to a valid handle, and b has not been initialized.
b = a
MPI_xxx(a)
If the argument to MPI_xxx is IN, then b is valid afterwards
If the argument to MPI_xxx is OUT or INOUT, then b may no longer
be a valid handle.
MPI_xxx(b)
If the argument to MPI_xxx is OUT, this is ok, and the result
does not depend on the value of b.
If the argument fo MPI_xxx is IN or INOUT, this is erroneous.
For buffer arguments, it is a bit more complicated, because
the *location* of the buffer matters even for OUT arguments,
and because the buffer argument itself doesn't uniquely
describe the data.
It is the data described by the (buffer, datatatype) pair
that is IN or OUT.
I'm not sure if MPI is rigorously consistent about this, but it's
the general intent, as I understand it.
Bill