size_t是否保证是整数类型之一的别名类型?
Is size_t guaranteed to be an alias type to one of integer types?
或者它可以是一个单独的无符号整数类型?
对于不同的(无符号)整数类型,我有不同的模板函数专门化。我需要为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_same
和std::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
的别名
- 继承模板类中的类型别名
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- 通过类型别名从构造函数转发模板推导
- C++中的严格别名规则和类型别名
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 什么是C++中的类型别名?
- 如何在不违反类型别名规则的情况下解释消息负载?
- 在模板派生类中继承具有类型别名的构造函数
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 使用类型别名,例如使用 A = int(int)
- 模板类函数指针类型别名
- 类型别名和类似类型
- 泛型类型别名,它们彼此不兼容
- 具有类型别名的循环依赖项
- 为什么模板引用类型不能用作模板类型别名参数?