std::vector::resize成员函数是这样的:
void resize (size_type n);
根据我的理解,size_type
应该是64 位
平台上的64 位长
类型。但是编译以下程序:
#include <iostream>
#include <climits>
#include <vector>
using namespace std;
vector<char> v;
int main() {
// your code goes here
v.resize(INT_MAX +1);
for (auto i = 0; i < v.size(); i++ ) {
cout << i << endl;
}
return 0;
}
生成以下警告:
g++ -std=c++11 hello.cpp
hello.cpp: In function ‘int main()’:
hello.cpp:11:19: warning: integer overflow in expression [-Woverflow]
v.resize(INT_MAX +1);
那么即使我们在 64 位
平台上工作,size_type
仍然是 32 位 int
?
最佳答案
vector 的 size_type
可能是 allocator::size_t
的类型定义,它(可能)是 std::size_t 的类型定义。这是一个无符号类型。生成的警告与 vector 的 resize()
签名无关。您超出了最大整数限制并且您的 INT_MAX + 1
表达式调用了 undefined behaviour .此外,for
循环将 i
的类型推断为 int
,这也会在比较有符号和无符号值时发出警告。如果你真的想要,你可以转换为 size_type
并添加 1
:
v.resize(static_cast<std::vector<char>::size_type>(INT_MAX) + 1);
并将 u
文字附加到 for
循环内的初始值:
for (auto i = 0u; i < v.size(); i++)
您可以通过以下方式获取基础类型名称:
std::cout << typeid(std::vector<char>::size_type).name();
关于c++ - 为什么 size_type 在 64 位平台上是 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47304364/