xyz a4=xyz(a1);
Bo to nie jest jedno wywołanie konstruktora. Pierwsza część:
xyz(a1)
Tworzy obiekt tymczasowy typu xyz wywołując konstruktor kopiujący. Ten obiekt jest tymczasowy, więc zniknie po zakończeniu tej linii.
xyz a4= (...)
Tworzy obiekt a4 próbując wywołać konstruktor kopiujący używając jako argument powyższy obiekt tymczasowy. Ale referencje do obiektów tymczasowych muszą mieć const, dlatego program się nie kompiluje.
Przy okazji, kanonicznie konstruktor kopiujący powinien brać const& jako argument.
Przy okazji [2], książka Praty nie zbiera dobrych recenzji.