c++ - 在 C++ 中,对应该具有相同内存布局的对象重新解释强制转换有多危险?

标签 c++ undefined-behavior

我编写了一系列函数模板来尽可能轻松地将任意内容转换为文本。例如, print(std::pair<int, int> {13, 1});将打印 {13, 1}和一些更长的东西,比如

std::vector<std::tuple<double, std::string>> vect;
for(int i=0;i<3;++i) {
    double root = sqrt(i);
    vect.push_back( {root, "sqrt " + std::to_string(i) } );
}
print(vect);

将输出:{ {0, "sqrt 0" }, {1, "sqrt 1"}, {1.41421, "sqrt 2"} }

假设我有以下结构:

struct point { int x, y; };

编写类似下面的代码有多危险?

std::vector<point> my_points;
//Add points into my_points;
print(reinterpret_cast<const std::vector<std::pair<int, int>>&>(my_points));

它在 gcc 中编译并产生预期的输出,尽管我担心如果有人尝试移植代码它可能会失败。

最佳答案

首先,您在这里没有进行任何动态转换,因为您的代码中没有对 dynamic_cast 的单个调用。您在这里所做的是 reinterpet_cast,由 c-cast 生成。

其次,不,它不安全并且在许多层面上都是未定义的行为。

关于c++ - 在 C++ 中,对应该具有相同内存布局的对象重新解释强制转换有多危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45354566/

相关文章:

c - 将指针转换为 void 指针并写入它是 UB 吗?

c - 返回复合文字

c++ - 空结构(或结构填充)可以有任意值吗?

c++ - 重载、覆盖和替换新/删除的限制是什么?

C++/C 虚拟/可嵌入文件系统 [交叉兼容(库)]?

c++ - "using namespace std"有什么用?

c - 指针地址符合标准的转换

c++ - 这个失败的测试是否将零添加到空指针未定义的行为、编译器错误或其他什么?

c++ - 检查并关闭 HANDLE

c++ - c++中iostream header 的cout,cerr,clog有什么区别?什么时候用哪一个?