Can someone explain why
std::vector<double>is considered "standard layout"
This is explained since C++11 in the "standard layout class rules", see https://en.cppreference.com/w/cpp/language/classes.html#Standard-layout_class:
A standard-layout class is a class that
has no non-static data members of type non-standard-layout class (or array of such types) or reference,
has no virtual functions and no virtual base classes,
has the same access control for all non-static data members,
has no non-standard-layout base classes, only one class in the hierarchy has non-static data members, and
So depending on how std::vector is implemented, all of those may very well be true. But it has nothing to do really with being PoD.
Different combinations of other traits may be used to check for PoD-like classes, lik the is_trivially_xyz family (ie. is_trivially_copyable).
Yet, from my work on an ASM-compiler, that needed to interopt with ASM/classes generated by MSVC, I think I remember there is no true trait to give you a true "pod" definition of a type, in a way that the compiler sees it - my example being the definition of "return values" in the x64 calling convention - here, a combination of is_trivially will not necessary align with what the compiler sees as pod, and I did not found a reliable way to detect it (even after asking stackoverflow).
Regardless, this might be a very specific example. In most cases, checks for trivially may be more than enough. For a lot of cases, it will be enough (and more correct/expressive) to just check for a specific property, instead of making your own "trivial" combined trait (for example, in template code that does copy of a value, just checking for trivially_copyable would be the most appropriate trait.