std::size_t与size_t与std::string::size_type的区别

23
  • 如果我没有包含任何头文件,那么 size_t 是从哪里来的?
  • 总是假设 size_t == std::size_t 合理吗?
  • 在什么情况下应该使用std容器中的 size_type(例如 string::size_typevector<T>::size_type 等)?

听起来像是编译器特定的。 - BЈовић
你能解释一下你第一个观察点是什么吗?对于你的编译器,即使你没有#include任何内容,size_t a;是否仍然可以作为声明工作?由于这似乎是关于实现的问题,你能告诉我们你正在使用哪个实现吗? - David Thornley
@DavidThornley 这正是我所看到的,我正在使用VS2010。 - David
3个回答

13
如果您的项目没有包含任何内容,那么您无法使用size_t。它在<stddef.h>中定义(如果您的头文件版本将定义放在全局命名空间以及std中,则可能还在<cstddef>中定义)。
是合理的假设size_t == std::size_t。只要包含适当的C ++头文件(例如<cstddef>而不是<stddef.h>),则C库定义的所有类型和函数都包括在std命名空间中。
如果您使用了某些标准类和模板(例如vector)中定义的size_type类型,可以在使用这些类时使用它们。在大多数情况下,您会知道它与size_t相同,因此最好使用它并节省一些输入。如果您正在编写通用代码,其中不知道类是什么,则最好使用size_type,以防它与size_t不兼容。
例如,您可能想编写一个容器,用于保存超出size_t表示范围的更多项。您可能会使用某种大数类型来表示容器的大小,该类型不能转换为size_t。在这种情况下,像size_t s = c.size()这样的代码将无法编译-您需要使用Container::size_type

在你的第一个观点上,当我没有包含任何内容时,我可以使用size_t。供参考 - 我正在使用VS2010。 - David
@Dave:那可能是该语言的微软扩展 - 这种扩展有很多。尝试禁用语言扩展进行编译。 - Mike Seymour
你对我所说的 std::____::size_type 的含义是正确的,但你能否详细说明它何时可能与 size_t 不兼容,以及 std::size_t 和 ::size_type 代表的区别? - David
@Dave:我在那上面添加了更多的细节。 - Mike Seymour
1
自C++14起,一个大小无法用std::size_t表示的类型是非法的。 - user3063349
@user3063349,没错,但是在这里,“类型的大小”指的是对象的大小,即sizeof(Type),而不是Type::size()的返回值。对于容器来说,Type::size()返回的是逻辑上包含的元素数量,这个数量可以是任何值。元素可以以不需要大型sizeof对象的方式存储 - 元素整体不需要在内存中存储,例如从磁盘读取或按需生成。std::容器只是恰好限制了自己的大小为std::size_t - Bolpat

3
当我在一个空项目中没有包含任何内容时,size_t从哪里来? size_t是C/C++语言标准库定义的一种基本无符号整数内存大小类型。它在"stddef.h"中被定义为C语言中的类型,在<cstddef>中被定义为C++语言中的类型。
"stddef.h"头文件定义的类型位于全局命名空间中,而<cstddef>头文件将size_t类型放置在std命名空间中。 C中的"stddef.h"被包含到C++中以实现兼容性,因此该类型可以在全局命名空间(::size_t)和std命名空间(std::size_t)中找到。

0

size_t<cstddef> 中定义,位于 std 命名空间中。


3
如果投票者能解释一下原因,那对我来说学习会很有帮助。 - Sanish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接