6

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

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

我也知道这些 C 头文件从开始被弃用,以支持它们的兼容性“cxxx”对应物。

现在,我相信这size_t是由Standard Defines Header专门定义的。所以我认为这在技术上意味着size_t全局命名空间中的定义已被弃用?

我已经使用它多年了,size_t在我开始使用std::size_t.

4

4 回答 4

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

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);

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

2)[extern.types]/1

对于 C 标准库中的每种类型T(这些类型是 [...] size_­t,[...]。),类型 ​<code>::​T 并std​::​T保留给 implementation[.]

3)[extern.types]/1

[...] 定义时,​::​T应与std​::​T.

于 2018-07-24T14:10:17.237 回答
3

不推荐使用C 样式的标头名称<stddef.h><cstddef>但是,允许C++ 风格的头文件在全局命名空间中声明它们的名称,然后std通过using-declarations ( http://eel.is/c++draft/organization#headers-4 ) 在命名空间中重新声明相同的名称。这种声明标准名称的方法未被弃用。许多实现正是这样做的,因此将名称size_t作为来自全局命名空间的名称进行访问并不罕见。但这不能保证。因此,在包含您的可移植 C++ 代码中,<cstddef>您应该使用std::size_t并且永远不要依赖::size_t's 的可用性。

于 2018-07-24T14:49:37.687 回答
2

标准说[expr.sizeof]

sizeof和的结果sizeof...是类型的常量std​::​size_­t。[注:std​::​size_­t在标准头文件中定义<cstddef>([cstddef.syn],[support.types.layout])。——尾注]

于 2018-07-24T14:12:21.413 回答
0

size_t 定义在哪里?

::size_t保证<stddef.h>在C++ 继承的其他 C 标准库头文件中定义。它可以由实现定义是否包含任何内容,因为它是保留的,但是依赖这种不保证的定义是不明智的。

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

确实。更准确地说,所有保证定义::size_t的标准头文件现在都在 C++17 中被弃用。这同样适用于所有其他非宏 C 库名称,例如::FILE.

于 2018-07-24T14:13:34.203 回答