C++11 and C++17 added some new exception types, e.g. bad_optional_access, bad_variant_access, bad_weak_ptr and a few others. They all derive directly from std::exception. It seems to me that these are all preventable if some checking was done first, and so should be derived from std::logic_error.
Does anyone know why they were not defined this way?