`size_t` 始终是 `vector<int>::size_type` 或任何其他容器类型的别名吗?

Ice*_*ire 5 c++ size-type

让我们举一个最简单的例子:

配方1:

std::vector<int> vec;
// add 10E11 elements
for(std::size_t n = 0; n < vec.size(); ++n)
    // ...
Run Code Online (Sandbox Code Playgroud)

配方2:

std::vector<int> vec;
// add 10E11 elements
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
    // ...
Run Code Online (Sandbox Code Playgroud)

自然,unsigned int或任何不适当的数据类型在这里都不起作用,我们必须编译 x64。我的问题是:在任何情况下,第一个公式是否会导致问题,或者我们是否可以安全地始终使用这种更短的符号来编写它?如果它们很容易覆盖(x86、任何其他容器、.的其他应用程序size_type),我也会对类似的设置感兴趣。

Pot*_*ter 4

std::vector保证指针对于其整个序列来说是有效的迭代器,因为返回“一个有效范围的vector::data指针”。[data(), data() + size())这是指针加法,它是在 上定义的std::ptrdiff_t,它是 的签名版本std::size_t

\n\n

此外,[iterator.requirements.general]/6 适用:

\n\n
\n

\xe2\x80\xa6 对于整数值n和可解引用迭代器值a(a + n),*(a + n)相当于*(addressof(*a) + n)\xe2\x80\xa6

\n
\n\n

可能比vector::size_type更窄std::size_t例如 64 位系统上的 32 位。但这不是我担心的事情。

\n