c++typesnamespacessize-tglobal-namespace

Where is size_t Defined?


So I know any header from the C Compatability Headers:

Places in the global namespace each name that the corresponding cxxx header would have placed in the std namespace

I also know that these C headers were deprecated as of , in favor of their compatibility "cxxx" counterparts.

Now, I believe that size_t is defined exclusively by the Standard Defines Header. So I presume this technically means that the definition of size_t in the global namespace has been deprecated?

I've been using it for years as just size_t and I'd just like a confirmation before I move to using std::size_t.


Solution

  • 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_t2, 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.