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)可以用来直接将数字标记为字节?或者问题只是因为我使用了统一初始化?
我不能说这是否更好,但它有所不同,因为您不必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
.