C++ 将初始化顺序与存储顺序解耦的方法

C++ 将初始化顺序与存储顺序解耦的方法,c++,initialization,memory-layout,C++,Initialization,Memory Layout,假设我希望能够对类Foo的对象进行内存布局优化: class Foo { T1 m_x; T2 m_y; }; 现在,T1:s必须始终具有对T2:s的有效引用,因此迫使我首先初始化T2。但这是不可能的,因为mux是第一位的。我可以为T1创建一个默认构造函数,但也可以使mux处于僵化状态。还有其他选择吗 在这种情况下,T1表示T2的视图。也就是说,可以在之后更改T2,但我希望T2始终引用有效对象: class T1 { public:

假设我希望能够对类
Foo
的对象进行内存布局优化:

class Foo
    {
    T1 m_x;
    T2 m_y;
    };
现在,T1:s必须始终具有对T2:s的有效引用,因此迫使我首先初始化T2。但这是不可能的,因为
mux
是第一位的。我可以为T1创建一个默认构造函数,但也可以使
mux
处于僵化状态。还有其他选择吗

在这种情况下,T1表示T2的视图。也就是说,可以在之后更改T2,但我希望T2始终引用有效对象:

class T1
    {
    public:
        explicit T1(const T2& obj):r_obj(&obj){}
        explicit T1(T2&& obj)=delete; //Don't ever pass a temporary object here...
        void set(const T2& obj) noexcept //Replace the view
            {r_obj=&obj;}

        void set(T2&& obj)=delete; //Again, temporaries are forbidden
        void doStuffThatRequiresObjToBeNonNull();

    private:
        const T2* r_obj;
    };

为什么不问问自己,为什么这些类是如此紧密地结合在一起?也许他们应该是同一个班?或者至少使用封装来反映
T1
T2
之间的依赖关系。如果您只参考
m_y
,这是可以的。@Jarod42,假设T1-ctor不使用obj。这就是我所说的“只参考”的意思。