【问题标题】:Is size_t guaranteed to be an alias type to one of integer types?size_t 是否保证是整数类型之一的别名类型?
【发布时间】:2014-07-08 03:01:40
【问题描述】:

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

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

【问题讨论】:

  • 你说的是“模板函数”,所以我把不相关的c标签去掉了。
  • cplusplus.com/reference/cstring/size_t 好像是别名,虽然我没有标准。如果这是正确的stackoverflow.com/a/1089181/3093378,那么它始终是unsigned 类型,但不确定它是否始终是别名。
  • 我看了那个帖子。它并没有说size_t 被定义为别名。那么它可以是,例如 64 位无符号,并且行为与 unsigned long 完全相同,但未定义为 typedef unsigned long size_t 并且是独立类型吗?还是它总是一个别名?
  • 在我的平台(OS X Mavericks,g++4.9)上,如果我提供两种不同的模板特化,一种用于unsigned long,一种用于size_t,我会得到redefinition error,所以size_tunsigned long 的别名。尽管在标准中找不到任何地方确实是这种情况。好问题。
  • @vsoftco 我在 linux 上也一样,所以我不专攻size_t。我想知道,如果它始终是可移植的或在某个平台上,它不是typedef,就会有问题

标签: c++ types typedef


【解决方案1】:

C++ 标准说:

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

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

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

因此,它没有明确说明实现定义的无符号整数类型是否为unsigned shortintlonglong 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 这样做......

【讨论】:

  • std::is_samestd::enable_if 解决了它。谢谢
【解决方案2】:

来自[support.types]的短信:

内容与标准 C 库头文件相同,有以下变化:

类型 size_t 是实现定义的无符号整数类型,它大到足以包含任何对象的大小(以字节为单位)。

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

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

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

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

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

【讨论】:

    【解决方案3】:

    根据 2013 年 10 月 13 日发布的 N3797 标准(第 18.2 节):

    类型 size_t 是实现定义的无符号整数类型,它大到足以包含 任何对象的大小(以字节为单位)。

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

    【讨论】:

    • 我看不出它在哪里说它是某个无符号整数类型的别名。
    • @user2052436,请参阅参考资料。
    • @RakibulHasan 您的帖子不清楚。从“是”开始,您似乎对 OP 问题的标题回答“是”(实际上标题的答案是“否”,但他的帖子正文第一行的答案是“是” ")。
    • @MattMcNabb,我的 Yes 指的是标题中的问题。我假设,从这个其他答案可以很容易地得出。
    • IDK 如何从引用的文本中获得“是”。它显然没有指定 size_t 必须是另一种类型的 typedef。
    【解决方案4】:

    是的。是的。

    我很确定它是unsigned long long 的别名。

    【讨论】:

    • 欢迎来到 SO!您能否提供任何参考资料来支持您的回答?
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2021-05-30
    • 2011-05-07
    相关资源
    最近更新 更多