最近我提出了以下黑客攻击:
template<typename T> class Vector<4,T>
{
public:
T x;
T y;
T z;
T w;
Vector<2,T>& upperLeft=*((Vector<2,T>*)(&x));
Vector<2,T>& lowerRight = *((Vector<2, T>*)(&z));
/*rest of class */
}
我是否应该期待任何隐藏的问题在将来从该代码到我的后端?
编辑: 这就是Vector&lt; 2,T&gt;看起来像:
template<typename T> class Vector<2,T>
{
public:
T x;
T y;
/*methods*/
}
答案 0 :(得分:2)
天啊
是。你现在依赖于未定义的行为。除了依赖两个类的确切布局(打包可能会在这里咬你),你也依赖于类型惩罚。这违反了严格的别名,除了UB之外,你的左上方成员可能没有对X或Y反射的改变。
也就是说,在打包#pragma
和任何Visual Studio的-fno-strict-aliasing
版本之间,你可能能够依赖它在给定具有特定优化/布局/等的编译器的特定版本的情况下工作标志。但是这段代码将特别针对编译器。