【问题标题】:Difference between usage of type size_t and int when used as template type?用作模板类型时 size_t 和 int 类型的用法之间的区别?
【发布时间】:2018-04-11 11:50:51
【问题描述】:

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

当使用 int 类型或 size_t 类型作为模板类型时,我很难理解使用 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 只是编码风格的问题吗?

【问题讨论】:

  • 混合使用可能会有问题。
  • 您的意思是除了int 是有符号整数而size_t 是无符号整数之外?或者代码读者看到的语义含义,例如size_t 并且知道 size 是预期的吗?
  • @Some 程序员老兄:是的,据我了解,使用 int 可能更受约定驱动(如果存在这样的约定),int 是定义索引的“足够好”类型(或至少被广泛使用)并且 size_t 在编程上更好,因为它降低了错误使用的风险。但在这种观点下,unsigned short 或 unsigned char 会更好,因为编译时递归算法在实践中必须用小的 N 值调用。

标签: c++ c++11 templates


【解决方案1】:

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 的签名等效项,作为另一种选择。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 2014-05-30
    • 2010-10-28
    • 2012-12-09
    • 2013-05-19
    • 1970-01-01
    • 2021-01-12
    • 2017-03-15
    相关资源
    最近更新 更多