使用成员对成员的引用是否存在任何陷阱



最近我想出了以下技巧:

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<2,T> 的样子:

template<typename T> class Vector<2,T>
{
public:
    T x;
    T y;
/*methods*/
}
哦,

上帝

是的。您目前依赖于未定义的行为。除了依赖于两个类的确切布局(包装可能会在这里咬你),你还依赖于类型双关语。这违反了严格的别名,除了 UB 之外,左上角成员中可能没有对 X 或 Y 的更改。

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

最新更新