簡體   English   中英

無法使用 Independent_bits_engine 隨機化字節

[英]Failed to randomize bytes using independent_bits_engine

我正在嘗試隨機化一個字節數組,但由於以下錯誤,它不允許我編譯它。 它甚至不適用於byte而不是std::uint8_t

錯誤 C2338:independent_bits_engine 的無效模板參數:N4659 29.6.1.1 [rand.req.genl]/1f 需要 unsigned short、unsigned int、unsigned long 或 unsigned long long 之一

消息:請參閱正在編譯的 class 模板實例化 'std::independent_bits_engine<std::mt19937,8,unsigned char>' 的參考

錯誤 C2338:注意:不允許使用 char、signed char、unsigned char、char8_t、int8_t 和 uint8_t

template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
    using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, std::uint8_t>;
    random_bytes_engine rbe;

    std::generate(std::begin(iv_buff), std::end(iv_buff), std::ref(rbe));
}

[rand.req.genl]/1.6 (在 C++23 草案中):

在整個子條款[rand]中,實例化模板的效果:

具有名為UIntType的模板類型參數的參數是未定義的,除非相應的模板參數是 cv-unqualified 並且是unsigned shortunsigned intunsigned longunsigned long long之一。

因此,效果是根據標准未定義的,因為您沒有使用上述類型之一。

您可以使用unsigned short來獲得相同的效果:

template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
    using random_bytes_engine = std::independent_bits_engine<std::default_random_engine,
                                                             CHAR_BIT, unsigned short>;
    random_bytes_engine rbe;

    std::generate(std::begin(iv_buff), std::end(iv_buff), rbe);
}

如果您收到警告(例如“unsigned short轉換為_Ty ,可能丟失數據”),您可以將對 rbe 的調用包裝在rbe中並執行static_cast

    std::generate(std::begin(iv_buff), std::end(iv_buff), [&rbe]() {
        return static_cast<std::uint8_t>(rbe());
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM