Effectively your List class violates the Rule of Three/Five, thus the compiler generated copy/move constructors will create unexpected side effects by implementing a shallow copy mechanism.
Let's suppose you have code like
int main() {
List l1;
List l2;
l1.push_back(5);
l1.push_back(42);
l1.push_back(21);
l2 = l1; // Copy the list
*l1.begin() = 80; // Change the original list
for(auto value : l2) {
std::cout << value << std::endl;
}
}
The output is
80
42
21
I doubt you really intended that. See the Live Demo please.