Proving things is hard, even if they are obviously true (whether they are true or not). Enabling the compiler to prove things in acceptable time is even harder. And then some side-effects might not actually matter, but how would you inform the compiler?
While copy-elision should not violate the as-if-rule (at least if the compiler knew which side-effeects to ignore in its analysis), the programmer has the freedom to write his types so it does anyway.
Finally, failure to prove that applying copy-elision does not violate the as-if-rule in a specific case might be very costly, as creating a copy of an object might be arbitrarily involved, needing time and space.
Thus, copy-elision was made an exception to the as-if-rule, being allowed regardless.
Now regarding guaranteed copy-elision, one has to concede that the rules are not necessarily completely obvious. Thus, it's a good thing that relying on it is only (?) necessary for performance, not correctness, at least where performance-requirements aren't too stringent..