所以我知道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_t
2,但如果实现确实如此,则两个定义必须匹配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
.