EDIT: Wrong language, but still applies
I agree with your three reasons, although there is one scenario where I have lamented the lack of this operator, when writing custom deserialization routines. In a couple of cases where an improperly serialized object wasn't really "exceptional" (and to prevent exception overhead in C# for very common failures), I would use boolean return values to signify whether a deserialization operation was successfull.
This code is completely theoretical, and Nested1, Nested2 and Nested3 are all structs:
public struct ComplexStruct
{
private Nested1 nested1;
private Nested2 nested2;
private Nested3[] nested3;
public bool Read(Reader reader)
{
bool ret = true;
int nested3Length = 0;
ret &&= nested1.Read(reader);
ret &&= nested2.Read(reader);
ret &&= reader.ReadInt32(ref nested3Length);
for(int i = 0; (ret && i < nested3Length); i++)
{
ret &&= nested3[i].Read(reader);
}
return ret;
}
}