Array notation in icc 12.1 generated the temporary, since that is what Fortran does and it seemed safer. Then we discovered that the temporaries, as the question notes, can have a big performance impact. So array notation was revised in icc 13.0 (and in the public specification) so that no temporary is generated.
Not generating a temporary is consistent with C++'s philosophy of "abstraction with minimal penalty", and the fact that C/C++ do not generate temporaries for structure assignments.
See also slide 33 of my ISC 2012 tutorial.