When a header for a newer C++ Standard is compiled with an older Standard mode, it emits a diagnostic. Our phrasing varies; some talk about the contents of the header:
Others talk about the main class or class template defined by that header:
https://github.com/microsoft/STL/blob/28ec9a32952e0d7443936f8d5ae5d675ba6cf65c/stl/inc/any#L445
https://github.com/microsoft/STL/blob/28ec9a32952e0d7443936f8d5ae5d675ba6cf65c/stl/inc/variant#L1754
Some don't bother to say "class" (and ignore the distinction between the basic_string_view class template and the string_view typedef):
And some have custom phrasing:
Should we be consistent about this phrasing?
My preference: "The contents of <meow> are only available with C++MEOW or later." This is currently used by <charconv>, <compare>, <concepts>, <filesystem>, <memory_resource>, and <ranges>.
Didn't @BillyONeal suggest that we should invert the conditionals that guard these "downlevel" diagnostics so the #pragma is nearer the top of the header file? (Admittedly these are separable issues, but the level of "creep" from combining them seems small to me.)
There's code inconsistencies too.
C++20 vs _HAS_CXX20 / ! vs not
https://github.com/microsoft/STL/blob/3b0a1c9cfa607840519e49e8589815c25078c3df/stl/inc/compare#L478
https://github.com/microsoft/STL/blob/3b0a1c9cfa607840519e49e8589815c25078c3df/stl/inc/ranges#L37
https://github.com/microsoft/STL/blob/3b0a1c9cfa607840519e49e8589815c25078c3df/stl/inc/concepts#L367
Double sided arrows
https://github.com/microsoft/STL/blob/3b0a1c9cfa607840519e49e8589815c25078c3df/stl/inc/variant#L1753