Już wyjaśniam.
std::vector::erase usuwa element z wektora. Ty używasz wektora nie "referencji", ale wartości. To oznacza że element który był po usuniętym, trzeba "przesunąć" na miejsce tego który usunąłeś. Ten który był po nim, także o jedno miejsce wstecz - i tak dalej.
To znaczy że dla każdego z nich musisz wykonać operację przypisania. Przykładowo usuwając z wektora "ABCD" literę "B" musisz wykonać następujące przypisania: "B=C", "C=D", a następnie zmniejszyć od końca rozmiar o 1. Jak możesz zgadnąć, jeśli te obiekty są "ciężkie", a usuwasz element po którym jest jeszcze wiele, to cała operacja będzie bardzo pracochłonna. Wtedy najlepiej tego nie robić, albo użyć innej struktury danych, jak listy.
Kompilator nie może napisać tutaj za ciebie potrzebnego do powyższej czynności operatora =, bo tak jak pisałem dwa posty temu referencje są w C++ czymś co ustawia się zawsze na początku ich istnienia i nie da się już zmienić. Jeśli miałeś w swoim obiekcie Employee pole tasks będące referencją na jakiś wektor w pamięci, to za nic nie da się już potem sprawić żeby wskazywała na inny. Taka jest zasada działania referencji w C++. A co za tym idzie, mając Alice z jednym zestawem tasków, i Boba z innym zestawem, w żaden oczywisty sposób nie da sie zaprogramować operatora przypisania Alice = Bob. Bo taski nadal pozostałyby te z Alice, nawet gdyby imię się zmieniło. Musiałbyś w swoim własnym operatorze przypisania zdecydować co z tym fantem zrobić - zapewne przekopiować taski Boba w miejsce tasków Alice, ale to nie jest coś co kompilator może bezpiecznie zgadywać, zwłaszcza że te taski mogą być nie kopiowalne.
Trzymanie membera jako referencji to często błąd - chyba że jesteś naprawdę pewien co do czasu życia bytu na który wskazujesz. Zamiast tego mógłyś trzymać po wartości albo jako shared_ptr. Referencje są najbardziej przydatne do przekazywania parametrów do funkcji, żeby uniknąć zbędnego i najczęściej niepożądanego kopiowania.
Operator = miał pierwotnie tylko jedną postać, kopiującą. Ona jest wystarczająca do poprawnego działania: "skopiuj wszystko co ma prawa strona i ustaw to po lewej stronie".
Ale czasami robimy coś takiego:
alice = new HR("Bob");
Skopiowanie wszystkiego z Boba zadziała, tylko po co kopiować, skoro Bob jest obiektem tymczasowym i umrze po średniku? Kopiowanie może być kosztowne. Dlatego w C++ 11 doszedł przenoszący operator przypisania. Ustawi Alice to co miał Bob, ale zamiast to kopiować, zabierze to od Boba. Nie przejmujemy się tym, bo Bob nie jest nam już dłużej potrzebny.
To nie jest brak podstaw z twojej strony - semantaka przenoszenia jest w C++ dość świeża, pojawiła się w ciągu kilku ostatnich lat, jej implementacja nie jest tez niezbędna do działania programów (ma głównie znaczenie optymalizacyjne).