Первая ошибка была из-за того, что он пытался использовать конструктор копирования с временным объектом.
ob1.fun(); // This returns an x by value
Таким образом, при его использовании слышать
x ob2=ob1.fun(); // You are passing it by value which requires a local temporary
// This is equivalent to this:
x ob2(obj1.fun()); // So it is trying to do a copy construction.
Временные привязки могут быть связаны толькочтобы констатировать ссылки.Таким образом, он не может скомпилироваться.
После того, как вы исправите эту проблему (с временной), теперь он может использовать конструктор копирования.Но компилятору разрешено оптимизировать его, если это возможно.Он не мог оптимизировать его, потому что ему даже не разрешалось использовать его в первой версии.