2017-04-14 72 views
0

我在我自己的滾動結構來表示顏色的過程,這就是我想出了:這種類型的狡猾法律和安全嗎?

struct Color { 
    typedef uint8_t color_t; 

    union { 
     struct { 
      color_t red, green, blue, alpha; 
     }; 
     struct { 
      color_t x, y, z, w; 
     } 
     std::array<color_t, 4> _data; 
    }; 

    /*...*/ 
}; 

這樣做是爲了簡化編寫索引代碼的行爲。就像,例如,operator[]代碼是這樣寫的:

//I haven't written bounds-checking yet. 
constexpr color_t & operator[](size_t i) { 
    return _data[i]; 
} 

constexpr color_t operator[](size_t i) const { 
    return _data[i]; 
} 

我的理解是,這應該是安全的(實際上,這個代碼編譯和運行,因爲我希望它),但在此我我實際上是正確的假設,還是我可能冒着未定義的行爲寫這樣的代碼?

+0

我相信我在過去的日子裏看到過幾個問題(也許有人會找到重複的,因爲我太懶惰了)。如果不是'union',你會更安全一些,因爲你會引用數組的元素。 –

+0

該結構的源文件可能會很小,那麼爲什麼不直接寫出更大的代碼而不是使用聯合(哪一個應該儘可能避免)呢?另外,我可以問你爲什麼定義operator []嗎?渠道的順序不會自動給出,這意味着沒有人有責任維護它。如果您需要在某個文件中編寫顏色,請將該責任交給顏色結構本身或寫入該圖像類的圖像類,然後使用使命令清晰的代碼,如「<<紅色<<綠色<<藍色'。 – Aziuth

+1

除此之外:你不需要實現邊界檢查自己,只需使用['std :: array :: at()'](http://en.cppreference.com/w/cpp/container/array/at) –

回答

3

從不活躍的聯盟成員讀取是未定義的行爲。

一次只有一個工會成員可以活躍。

前綴的佈局兼容性是一個例外,但陣列不符合標準下具有多個成員的任何struct

可能會生成合法有效的operator[](size_t),但不能通過union

+0

如果'uint8_t'是一個字符類型,是否有任何理由允許通過字符指針讀取和寫入任何類型的PODS的規則不適用於通過數組訪問? – supercat