c++ - 用作模板类型时,size_t 类型和 int 类型的用法有何区别?

标签 c++ c++11 templates

我对元编程仍处于基本了解。

当使用 int 类型作为模板类型时,我正在努力理解使用 int 类型或 size_t 类型的区别(如果有的话)。

我了解标准 C++ 编程中两者之间的区别,如此处所述 What's the difference between size_t and int in C++?

然后,当阅读与某些模板技巧相关的问题时,人们似乎倾向于无差别地使用它们。 例如这个 How can I get the index of a type in a variadic class template? Barry 正在使用 std::integral_constant 实例化 size_t 类型

在这个问题中:C++11 Tagged Tuple ecatmur 提供了一个答案,其索引助手使用 std::integral 的 int 类型实例。

修改一个与另一个似乎对我测试过的没有影响。这些模板专门化是递归的,无论如何,我认为在实践中,如果索引 N 太大,编译器就会崩溃。

在这个特定的上下文中选择 int 或 size_t 仅仅是编码风格的问题吗?

最佳答案

std::size_t 是一种无符号类型,至少与 unsigned int 一样大。

int 是有符号类型,其上限小于 unsigned int 的上限。

将有一些值无法用 int 表示,而 size_t 可以表示。

-1 作为 int 传递会产生负值。将 -1 作为 size_t 传递会产生一个较大的正值。

int 上的溢出是未定义的行为;编译时未定义的行为使得表达式在某些上下文中成为非constexpr

size_t 上的溢出是已定义的行为,对于某些(未指定)n,它是数学模 2^n

C++ 中的许多容器使用 size_t 进行索引,而 tuple 使用它作为其 get 的索引。

无符号值有缺点,因为它们在“接近零”时表现得很奇怪(与“实整数”不同),而int在远离零时表现得很奇怪,而且远离零的情况更为罕见情况而不是接近于零。

size_t 不能为负数,这似乎可以用来表示不能为负数的值,但环绕行为有时会导致大问题。我发现这种情况在编译时代码中发生的情况较少。

您可以使用 ptrdiff_t 作为另一种选择,它基本上是 size_t 的有符号等价物。

这两种选择都会产生后果。您想要处理哪些后果取决于您。哪个更好,见仁见智。

关于c++ - 用作模板类型时,size_t 类型和 int 类型的用法有何区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016283/

相关文章:

c++ - C 编程一元运算符优先级

c++ - 如何从字符串中删除第一个单词?

c++ - CRTP 和默认赋值运算符

C++ 模板元编程,成员变量的数量?

c++ - 程序没有编译,即使我正在从书中复制代码

java - 在 Android 中使用 OpenCV 非自由模块

c++ - 如何为具有自定义类型的 std::vector 创建显式模板实例化声明?

c++ - 如何告诉模板参数是从某个类派生的

c++ - 尝试根据 move 赋值编写 move 构造函数

c++ - 何时调用移动构造函数?