Sometimes it\'s wise to split complicated or long expressions into multiple steps, for example (the 2nd version isn\'t more clear, but it\'s just an example):
The compiler cannot break the "as-if" rule in this case. But you can use std::move to achieve the desired effect:
std::move
object3 a(x); object2 b(std::move(a)); object1 c(std::move(b)); return c;