I've seen conflicting declarations of the standard exception classes like logic_error etc. In some references their constructors are declared with throw(), and in others they aren't.
Take out_of_range for example: out_of_range - C++ Reference
Code:
class out_of_range : public logic_error {
public:
explicit out_of_range (const string& what_arg);
};
This one doesn't use throw(), but I've seen it defined with throw() in other places.
Since it takes a string and probably converts that to a C string that the what() function will return, I don't see how it can be exception safe since c_str() isn't.