我编写了一系列函数模板来尽可能轻松地将任意内容转换为文本。例如,
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/