none
關於 C2625 union 中使用 reference RRS feed

  • 問題

  • 不好意思因為舊的帳號遺失了,只好重新發問
    我們有一些舊的程式碼在 VS2015 之後的編譯器上會出現 C2625 的錯誤,表示禁止在 union 中使用 reference? 我看不出來錯誤的理由是什麼,有人能為我解惑嗎?

    class CVectorReference3FLOAT {

    public:

    union {

    struct { float &m_x,&m_y, &m_z; };

    struct { float &m_s,&m_t, &m_p; };
    struct { float &m_r,&m_g, &m_b; };

    };

    CVectorReference3FLOAT(float & Value0, float & Value1, float &Value2):
    m_x(Value0), m_y(Value1), m_z(Value2),
    m_s(Value0), m_t(Value1), m_p(Value2),
    m_r(Value0), m_g(Value1), m_b(Value2){}
    };
    float A,B,C;
    CVectorReference3FLOAT Point(A,B,C);
    Point.m_x = 3.0f; Point.m_y = 1.0f; Point.m_z = 2.0f;
    CVectorReference3FLOAT Color(A,B,C);
    Color.m_r = 0.5f; Color.m_g = 0.3f; Color.m_b = 1.0f;

    我只是讓同一塊記憶體空間允許不同的名稱,而不用佔用兩份參考為什麼要被報錯?

    union utype {
    	struct a{ int& m_x, & m_y; };
    	struct b{ int& m_s, & m_t; };
    };
    
    class CVectorReference2BYTE {
    public:
    	union utype u;
    };

    我試著實現 tihs (MCC, MVP) 給我的答覆,但是無法進行初始化
    查詢 The C++ Programming Language 4th 說 C11 後 union 不能使用 Reference ?
    因為是個數學運算的類別如果退回改用指標程式會變得非常難閱讀

    在 CVectorReference3FLOAT 出現這樣的內容應該會想要咬人

    (*m_x) = 1.0f;
    float length = sqrtf(*m_x * *m_x + *m_y * *m_y + *m_z * *m_z);

    float length = sqrtf((*m_x) * (*m_x) + (*m_y) * (*m_y) + (*m_z) * (*m_z));

    還有別的方法實現參考等級的資料異名嗎?

    C++ 原本的簡潔高效都去哪裡了 orz



    2020年5月11日 上午 06:16

所有回覆

  • 這個規定是從Visual C++ 2015開始的限制, 如果union成員要記錄位址, 只能用指標, 無法再用reference, 除非使用Visual C++ 2013或更早的版本
    2020年5月11日 上午 07:58