我对元编程仍处于基本了解。
当使用 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/