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

时间:2014-05-20 01:52:46

标签: c++ types typedef

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

我对不同(无符号)整数类型的模板函数有不同的特化。我是否需要为size_t提供单独的专业化?

4 个答案:

答案 0 :(得分:7)

C ++标准说:

  

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

     

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

     

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

所以,它没有明确说明实现定义的无符号整数类型是unsigned shortintlong之一, long long。事实是18.2 / 6存在并且指定了一个"实现定义的无符号整数类型"可能会看到覆盖18.2 / 2的默认后续C,因此C的任何答案都不可信任C ++。

建议重新转换排名意味着size_t预计将成为4.13中提到的类型之一,其中size_t未明确提及,但显而易见的候选人是,但是#&# 39;不能保证。

  

我是否需要为size_t提供单独的专业化?

std::is_same是一种独特的类型时,您可以使用std::enable_ifsize_t来执行此操作....

答案 1 :(得分:1)

来自[support.types]的文字:

  

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

     

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

根据stddef.h的C99规范,还有一个脚注供澄清:

  

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

由于C ++标准文本没有具体说size_t必须是typedef,并且因为它似乎是基于C99,所以在我看来我们应该得出结论它可能是一个实现定义的扩展整数类型。

话虽如此,我不知道它不是typedef的任何实现。

我不确定您应该对您的过载问题做些什么,但请注意,它不仅限于size_t;还有ptrdiff_t和所有固定宽度的整数类型。后者被指定为typedef s,但是它们可以是扩展整数类型的别名。

答案 2 :(得分:0)

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

  

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

所以它必须是 unsigned 整数类型,但实际大小是实现定义的。

答案 3 :(得分:-1)

是的。是的。

我可以肯定它是unsigned long long的别名。