Currently, libc++'s <stdexcept> doesn't play nice with vcruntime. Specifically:
- logic_error and runtime_error have a different layout.
- libc++'s logic_error and runtime_error override what() but vcruntime does not.
- vcruntime uses weak vtables for <stdexcept> types.
- libc++'s <stdexcept> constructors and assignment operators may have different manglings than vcruntimes.
This patch makes libc++'s declarations in <stdexcept> match those provided by MSVC's STL as closely as possible.
If MSVC doesn't declare a special member, then neither do we. This ensures that the implicit definitions have the same linkage, visibility, triviality, and noexcept-ness.
Ah, so libc++ is using std::string, and vcruntime is using std::__1::string? But libc++ only defines basic_string in namespace __1, so aren't both actually referring to std::__1::string? I'm a bit confused.