如何在 C++ 中声明和初始化字节数组

lew*_*wis 5 c++ byte literals uniform-initialization c++20

这真的是声明字节(或字节数组)的最佳方式吗?

static constexpr byte kGuard1_[] = {
            byte{0x45}, byte{0x23}, byte{0x12}, byte{0x56}, byte{0x99}, byte{0x76}, byte{0x12}, byte{0x55},
        };
Run Code Online (Sandbox Code Playgroud)

为什么没有一些后缀(如 b)可以用来直接将数字标记为字节?或者问题只是因为我使用了统一初始化?

Ted*_*gmo 8

我不能说这是否更好,但它有所不同,因为您不必byte对每个元素重复:

#include <array>
#include <utility>

template <class T, class... Args>
constexpr auto mkarr(Args&&... args) {
    return std::array{static_cast<T>(std::forward<Args>(args))...};
}

static constexpr auto kGuard1 = mkarr<std::byte>(0x45, 0x23, 0x12, 0x56,
                                                 0x99, 0x76, 0x12, 0x55);
Run Code Online (Sandbox Code Playgroud)

请注意,它使用 astd::array<std::byte, 8>而不是 a std::byte[8]


为什么没有一些后缀(如 b)可以用来直接将数字标记为字节?

我不能说,但如果您愿意,您可以定义自己的用户定义文字,该文字可以与 C 数组一起使用。

constexpr std::byte operator""_B(unsigned long long x) {
    // note: no space between "" and _B above
    return static_cast<std::byte>(x); 
}

static constexpr std::byte kGuard1[]{0x45_B, 0x23_B, 0x12_B, 0x56_B,
                                     0x99_B, 0x76_B, 0x12_B, 0x55_B};
Run Code Online (Sandbox Code Playgroud)

或者问题只是因为我使用了统一初始化?

不,只是没有隐式转换为std::byte.