1) Having the whole program in a try block will not incur any performance hit, apart from that incurred by having exceptions enabled at all
2) It is OK because you are throwing by value. Throwing by value means that whatever you throw is copied when thrown. So throwing any temporary is perfectly valid because a copy is made.
3)
The std::exception class, as far as I can determine, can only ever throw a char*
. However you could always subclass it and implement support for wchar if you wanted.
It is worth noting that you shouldn't just have a try catch around main()
if that is what you were intending.