使用成员引用成员是否有任何陷阱?

时间:2014-02-10 19:25:44

标签: c++ visual-c++ c++11

最近我提出了以下黑客攻击:

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*/
}

1 个答案:

答案 0 :(得分:2)

天啊

是。你现在依赖于未定义的行为。除了依赖两个类的确切布局(打包可能会在这里咬你),你也依赖于类型惩罚。这违反了严格的别名,除了UB之外,你的左上方成员可能没有对X或Y反射的改变。

也就是说,在打包#pragma和任何Visual Studio的-fno-strict-aliasing版本之间,你可能能够依赖它在给定具有特定优化/布局/等的编译器的特定版本的情况下工作标志。但是这段代码将特别针对编译器。