size_t定义在哪里?

Jon*_*Mee 6 c++ types namespaces size-t global-namespace

所以我知道C Compatability Headers中的任何标题:

在全局命名空间中放置相应的cxxx头将放置在std命名空间中的每个名称

我也知道这些C头文件在中已被弃用,赞成它们的兼容性"cxxx"对应物.

现在,我相信它size_t仅由标准定义标题定义.所以我认为这在技术上意味着size_t全局命名空间中的定义已被弃用?

我已经使用它多年了,size_t而且在转向使用之前我只是想确认一下std::size_t.

YSC*_*YSC 6

我认为这在技术上意味着全局命名空间中size_t的定义已被弃用?

对,但是.

该标准仅任务std::size_t必须被定义1通过<cstddef>,它不会禁止以限定一个实现::size_t2,但如果执行呢,这两个定义必须匹配3.

作为结论,您应该使用std::size_t并且既不应该依赖于::size_t定义也不应该定义它.

以下是UB:

// DON'T
using size_t = std::size_t;        // UB
using size_t = decltype(sizeof 1); // UB
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

[...]
标题的内容和含义<cstddef>与C标准库标题相同<stddef.h>,只是它没有声明类型wchar_­t,它还声明了类型byte及其关联的操作([support.types.byteops]),并且如[support.types.nullptr]和中所述[support.types.layout].

2)[extern.types]/1

对于每种类型的T从C标准库(这些类型[...] size_­t[...]),其种类::?Tstd?::?T被保留到执行[.]

3)[extern.types]/1

[...]定义时,?::?T应与... 相同std?::?T.