I presume this technically means that the definition of size_t in the global namespace has been deprecated?
Yes... but.
The Standard only mandates that std::size_t
must be defined1 by <cstddef>
, it does not disallow an implementation to define ::size_t
2, but if the implementation does, the two definitions must match3.
As a conclusion, you should use std::size_t
and should neither rely on ::size_t
to be defined nor define it.
The following are UB:
// DON'T
using size_t = std::size_t; // UB
using size_t = decltype(sizeof 1); // UB
1) [cstddef.syn]
namespace std {
using ptrdiff_t = see below;
using size_t = see below;
using max_align_t = see below;
using nullptr_t = decltype(nullptr);
[...]
The contents and meaning of the header <cstddef>
are the same as the C standard library header <stddef.h>
, except that it does not declare the type wchar_t
, that it also declares the type byte
and its associated operations ([support.types.byteops]
), and as noted in [support.types.nullptr]
and [support.types.layout]
.
2)[extern.types]/1
For each type T
from the C standard library (These types are [...] size_t
,[...].), the types ::T
and std::T
are reserved to the implementation[.]
3)[extern.types]/1
[...] when defined, ::T
shall be identical to std::T
.
Now, I believe that size_t is defined exclusively by the Standard Defines Header
is not exactly correct, since many of the C compatibility library headers besidescstddef
define it. – Rohde::size_t
is deprecated. – Sedgemoor::size_t
is not required to be define. I would reason that it addresses the part about deprecation because the standard can't deprecate something it doesn't define. – Harl