矢量与reinterpret_cast

Kha*_*efa -3 c++ vector reinterpret-cast

以下代码仅向vector插入一个值col。该代码是从DBMS代码库(用于导入文件)中提取的,特别是从1

该代码使用void *能够读取任何字段类型(int,float等)。

#include <iostream>
#include <vector>
using namespace std;

void add(std::vector<void*> &col){
  reinterpret_cast<std::vector<int>&>(col).push_back( 1);
  reinterpret_cast<std::vector<int>&>(col).push_back( 2);
  reinterpret_cast<std::vector<int>&>(col).push_back( 13);
}
int main() {
 std::vector<void*> col;

 add(col);
 cout << col.size() << endl;
 for(int i=0;i<col.size();i++)
    cout <<reinterpret_cast<std::vector<int>&> (col)[i] <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不确定此代码如何工作?

Rem*_*eau 6

您的代码表现出未定义的行为

std::vector<void*>并且std::vector<int>是两个完全独立且不相关的类型,因此您无法以自己的方式安全地在它们之间进行强制转换,尤其是因为不能保证void*并且int具有相同的字节大小。

强制转换您要推送的,请勿强制转换vector本身,例如:

#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;

void add(std::vector<void*> &col) {
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(1)));
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(2)));
    col.push_back(reinterpret_cast<void*>(static_cast<intptr_t>(13)));
}

int main() {
    std::vector<void*> col;

    add(col);

    cout << col.size() << endl;
    for(int i=0;i<col.size();i++)
        cout << reinterpret_cast<intptr_t>(col[i]) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,您确实应该使用正确的容器类型开始:

#include <iostream>
#include <vector>
using namespace std;

void add(std::vector<int> &col) {
    col.push_back(1);
    col.push_back(2);
    col.push_back(13);
}

int main() {
    std::vector<int> col;

    add(col);

    cout << col.size() << endl;
    for(int i=0;i<col.size();i++)
        cout << col[i] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)