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(任何值得使用的编译器都会对它进行排序,所以它是免费的)