I don't think the reason for this is technical at all. I think it's fairly easy: you can't assume that a*b == b*a. That is, not all multiplications are commutative. Sure, the multiplication of two integers is, but matrix multiplication is not, for instance. So let's say we have operator*(Matrix1Type, Matrix2Type) and the operator* of the two reversed is called, we get unexpected results, which are probably fairly hard to debug as well.