用作模板类型时size_t和int类型的使用之间的区别?

时间:2017-10-30 13:19:21

标签: c++ c++11 templates

我仍然对元编程有基本的了解。

我很难理解在将此类型用作模板类型时使用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正在使用用size_t类型

实例化的std :: integral_constant

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

用另一个修改一个似乎对我测试的内容没有影响。那些模板专业化是递归的,我认为无论如何,如果索引N太大,实际上编译器会崩溃。

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

1 个答案:

答案 0 :(得分:0)

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

int是签名类型,其上限小于unsigned int的上限。

int可以代表的size_t无法表示值。

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

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

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

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

无符号值存在缺点,因为它们表现得很奇怪(不像"实数整数")"接近零",而int表现得奇怪地远离零,远离零是一种罕见的情况,而不是接近于零。

size_t不能是否定的,这似乎有助于表示不能为负的值,但环绕行为有时会导致大问题。我发现编译时代码发生的情况不那么发生了。

您可以使用ptrdiff_t作为另一种选择,基本上是size_t的等效签名。

这两种选择都会产生影响。您想要处理的这些后果中有哪些因素取决于您。哪个更好,是一个意见问题。