According to standard, it is illegal to bind a non const reference to a temporary object. Visual Studio incorrectly allows it but give a warning at level 4.
Thus the function should be declared as:
bool CanShoot(const Vector2D& Target=Vector2D()) { return true; }
However, it would be preferable to add an overload in this case:
bool CanShoot()
{
Vector2D temp;
return CanShoot(temp);
}
This has the advantage that the "default value" can be hidden in the implementation. And it can allows some optimisations to be done.