我仍然对元编程有基本的了解。
我很难理解在将此类型用作模板类型时使用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只是一个编码风格的问题?
答案 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
的等效签名。
这两种选择都会产生影响。您想要处理的这些后果中有哪些因素取决于您。哪个更好,是一个意见问题。