It's because the username is part of the URL (web address) when you go to your profile, e.g. http://pokemondb.net/pokebase/user/PikaPals
/ means a new folder so we can't use that in a username
+ is also a special character that replaces spaces, for example Mike's URL is /pokebase/user/~Holy+Name
so if we allowed + then Holy Name and Holy+Name would both exist.
Not 100% sure about @ but it's generally a special character in many things.