C++ 使用成员引用成员是否存在任何陷阱?

C++ 使用成员引用成员是否存在任何陷阱?,c++,visual-c++,c++11,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

最近,我想出了以下方法:

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 */
 }
模板类向量
{
公众:
tx;
T y;
tz;
TW;
向量&左上=*((向量*)(&x));
向量&lowerRight=*((向量*)(&z));
/*其他同学*/
}
我是否应该期待将来从代码中发现任何隐藏的问题

编辑: 这就是向量的样子:

template<typename T> class Vector<2,T>
{
public:
    T x;
    T y;
/*methods*/
}
模板类向量
{
公众:
tx;
T y;
/*方法*/
}
哦,上帝

对。你现在依赖于未定义的行为。除了依赖于两个类的精确布局(这里的包装可能会咬你),你还依赖于类型双关。这违反了严格的别名,并且,除了UB之外,您可能不会在左上方的成员中更改X或Y反射


也就是说,在打包
#pragma
s和Visual Studio版本的
-fno-strict aliasing
之间,如果编译器的特定版本具有特定的优化/布局/etc标志,您可能可以依赖它工作。但是这段代码将是非常特定于编译器的。

是的。x不是向量,它是T,所以。这很可能是一个错误。T甚至不可能是一个向量,因为它是一个向量Vector@Well,一个向量只不过是一个包含两个元素的向量,其长度和内存布局与Vector4的一半相同。那么它可能是正常的,也可能不是,这取决于类中是否有虚函数。如果不行,那就行了。但是,如果这是您想要的行为,您应该改用联合。除了前面提到的内容之外,这还可以为每个
向量
实例添加4或8个字节。最好创建一个方法来返回一个
向量
;复制两个float或double真的没那么贵。@Thomas(任何值得使用的编译器都会对它进行排序,所以它是免费的)