Well, that's true for exception_detail, but error_info has a public non-virtual destructor and might be used as a base class (I am sure it isn't, but when I just have a quick look at it when coding it doesn't say that it shouldn't).
error_info has a protected (not public) non-virtual destructor, by design.
Just checked the code provided in 1.46.1: template <class Tag,class T> class error_info: public exception_detail::error_info_base { public: typedef T value_type; error_info( value_type const & value ); ~error_info() throw(); value_type const & value() const { return value_; } value_type & value() { return value_; } private: std::string tag_typeid_name() const; std::string value_as_string() const; value_type value_; }; }