所以我知道C Compatability Headers中的任何标题:
将对应的 cxxx 标头放置在命名空间中的每个名称都放置在全局命名
std空间中
我也知道这些 C 头文件从c++17开始被弃用,以支持它们的兼容性“cxxx”对应物。
现在,我相信这size_t是由Standard Defines Header专门定义的。所以我认为这在技术上意味着size_t全局命名空间中的定义已被弃用?
我已经使用它多年了,size_t在我开始使用std::size_t.
所以我知道C Compatability Headers中的任何标题:
将对应的 cxxx 标头放置在命名空间中的每个名称都放置在全局命名
std空间中
我也知道这些 C 头文件从c++17开始被弃用,以支持它们的兼容性“cxxx”对应物。
现在,我相信这size_t是由Standard Defines Header专门定义的。所以我认为这在技术上意味着size_t全局命名空间中的定义已被弃用?
我已经使用它多年了,size_t在我开始使用std::size_t.
我认为这在技术上意味着全局命名空间中 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
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]。
对于 C 标准库中的每种类型
T(这些类型是 [...]size_t,[...]。),类型 <code>::T 并std::T保留给 implementation[.]
[...] 定义时,
::T应与std::T.
不推荐使用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 的可用性。
标准说[expr.sizeof]:
sizeof和的结果sizeof...是类型的常量std::size_t。[注:std::size_t在标准头文件中定义<cstddef>([cstddef.syn],[support.types.layout])。——尾注]
size_t 定义在哪里?
::size_t保证<stddef.h>在C++ 继承的其他 C 标准库头文件中定义。它可以由实现定义是否包含任何内容,因为它是保留的,但是依赖这种不保证的定义是不明智的。
所以我认为这在技术上意味着全局命名空间中 size_t 的定义已被弃用?
确实。更准确地说,所有保证定义::size_t的标准头文件现在都在 C++17 中被弃用。这同样适用于所有其他非宏 C 库名称,例如::FILE.