They way you implemented equals and less than operators brings to mind you don't mention how logical expressions and bitwise logical expression work in C++. I would also take about freestanding operator overloading btw in your operator overloading chapter.
bool operator < (const A& lhs, const A& rhs)
{
return lhs.x < rhs.x && lhs.y < rhs.y
}
bool operator==(const A& lhs, const A& rhs)
{
return lsh.x == rhs.x && lhs.y == rhs.y;
}
They can become super handy when you have to overload things you can't express with a member overload operator.
Vector2 myVector; //Vector has a Vector2 operator*(float scalar);
auto result = myVector * 2;
auto result = 2 * myVector; //you can't express this with a member function for example.