size_t是否保证是整数类型之一的别名类型?

Is size_t guaranteed to be an alias type to one of integer types?

本文关键字:类型 别名 整数 是否 size      更新时间:2023-10-16

或者它可以是一个单独的无符号整数类型?

对于不同的(无符号)整数类型,我有不同的模板函数专门化。我需要为size_t提供单独的专门化吗?

c++标准规定:

18.2/2内容与标准C库头文件相同,但有以下更改:

18.2/6类型size_t是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小。

18.2/7[注意:建议实现为ptrdiff_t和size_t的整数选择类型转换等级(4.13)不大于带符号long int的等级,除非需要更大的等级包含所有可能的值。-end note]

因此,它没有明确地说明实现定义的无符号整数类型是否为unsigned short, int, long, long long之一。事实上,18.2/6存在并指定了一个"实现定义的无符号整数类型",可能会被视为覆盖18.2/2默认遵循C,因此任何C的答案都不能被c++信任。

推荐的重转换等级意味着size_t将是4.13中提到的类型之一,其中没有明确提到size_t,但明显的候选类型是,但这不能保证。

我需要为size_t提供单独的专门化吗?

size_t是不同的类型时,您可以使用std::is_samestd::enable_if来完成此操作....

来自[support.types]的文本:

内容与标准C库头文件相同,但有以下更改:

size_t类型是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小。

从stddef.h的C99规范中也有这个脚注来澄清:

224)这些类型中的一些可能表示实现定义的扩展整数类型。

由于c++标准文本并没有明确指出size_t必须是一个类型定义,而且由于它似乎是基于C99的,在我看来,我们应该得出结论,它可能是一个实现定义的扩展整数类型。

说了这么多,我不知道任何实现它不是一个类型定义。

我不确定你应该如何处理你的过载问题,但请注意,它不仅限于size_t;还有ptrdiff_t,以及所有固定宽度的整数类型。后者被指定为typedef,但是它们被允许作为扩展整数类型的别名。

来自2013年10月13日发布的N3797标准(§18.2):

size_t类型是一个实现定义的无符号整数类型,它足够大,可以包含以字节为单位的任意对象的大小。

所以它必须是无符号整型,但实际大小是实现定义的。

是。它是。

我很确定这是unsigned long long的别名