2017-07-18 239 views
1

用預定的std :: byte值初始化容器的正確方法是什麼?正確初始化std :: byte的容器的方法:

std::array<std::byte, 2> arr{0x36, 0xd0}數組導致

枚舉的std ::字節具有不恆定代表X

和編譯器錯誤的整數值。向量和初始化器列表也是不可行的。

std :: vector與std :: copy並且真的轉換了處理這個的預期方式?

+0

的數值n可以被轉換爲字節值的std ::字節{N} ,這是由於C++ 17放寬了枚舉類的初始化規則。 http://en.cppreference.com/w/cpp/types/byte –

+0

好吧,我知道這一點,這個例子完全正確。但是,比方說,20個值......這很麻煩。真的沒有更好的辦法嗎? – Dassem

+1

作爲一個感興趣的問題,你爲什麼要使用std :: byte而不是說unsigned char? –

回答

7

您必須編寫std::byte{0x36},因爲沒有從intenum class的隱式轉換。

std::array<std::byte, 2> arr = {std::byte{0x36}, std::byte{0xd0}}; 

如果你不想寫std::byte每一次,寫一個輔助函數:使用

template<typename... Ts> 
std::array<std::byte, sizeof...(Ts)> make_bytes(Ts&&... args) noexcept { 
    return{std::byte{std::forward<Ts>(args)}...}; 
} 

auto arr = make_bytes(0x36, 0xd0); 
+0

完美,正是我所期待的。謝謝。 – Dassem

+4

當你知道所有東西都是char/unsigned char時,你並不需要完美的轉發:) – Barry

+0

即將發佈我自己的答案,因爲我天真地會期望'std :: array arr { {0x36},{0xd0}};'也可以工作(Spoiler:沒有)。我認爲他們確實需要消除初始化列表和集合初始化之間的不一致性。 –