正确的方法来初始化std :: byte的容器

Das*_*sem 2 c++ stl c++17

使用预定的std :: byte值初始化容器的正确方法是什么?

std::array<std::byte, 2> arr{0x36, 0xd0} 对于数组结果

Enum std :: byte没有常量来表示X的整数值

和编译器错误.矢量和初始化列表也是禁止的.

std :: vector与std :: copy和强制转换是否真的是处理它的预期方式?

Rak*_*111 8

你必须写std::byte{0x36},因为没有从a int到a的隐式转换enum class.

std::array<std::byte, 2> arr = {std::byte{0x36}, std::byte{0xd0}};
Run Code Online (Sandbox Code Playgroud)

如果您不想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);
Run Code Online (Sandbox Code Playgroud)

  • 当你知道一切都是char/unsigned char时,你真的不需要完美的转发:) (5认同)
  • @NickBolas,除了 C++ 教育者(甚至 Bjarne)喜欢将初始化列表称为“统一初始化语法”这一事实。当大括号可以有多个不一致的含义时,这显然是有误导性的。是的,如果我知道初始化的所有规则,就很清楚应该发生什么。但对于任何不了解初始化列表和聚合初始化之间差异的人来说,初始化列表和聚合初始化之间的差异似乎是任意且神秘的。这是导致高级甚至中级 C++ IMO 无法教授的众多因素之一。我有很多困惑的同事因为这些事情来找我。 (2认同)