将INT32BE宏转换为 constexpr 是否正确?
Is this conversion of an INT32BE macro to a constexpr correct?
>我有以下宏,并希望将其转换为constexpr
,因为显然这是一种更好的方法:
#define INT32BE(x) (x[0] << 24 | x[1] << 16 | x[2] << 8 | x[3])
尝试:
template <typename T>
constexpr auto Int32BE(T array [])
{
return array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3];
}
这旨在按以下方式使用:
const auto address = Int32BE(data.Address);
Address
的定义如下:
UCHAR Address[4];
它确实按预期工作,但我不完全确定应该如何编写。
问题:
这是从正确写入的数组中读取 32 位整数constexpr
吗?
我不能从"语言律师"的角度说话,但是您给出的constexpr
在以下代码中毫无警告地编译,同时包含MSVC
和clang-cl
:
#include <stdio.h>
template <typename T>
constexpr auto Int32BE(T array[]) {
return array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3];
}
int main() {
unsigned char Address[4] = { 0x22, 0xAA, 0x11, 0xBB };
const auto address = Int32BE(Address);
printf("%08Xn", address);
return 0;
}
此外,输出是期望值(22AA11BB
(。
相关文章:
- 是否可以使用if constexpr删除控制流语句
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否可以将带有字符串化运算符的宏转换为 constexpr?
- 将INT32BE宏转换为 constexpr 是否正确?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 在 constexpr 构造函数中初始化数组是否合法?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 是否使用静态 constexpr 变量 odr?
- 是否可以跨多个源文件构建 constexpr 数据结构?
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- 是否可以将变体的索引作为 constexpr 变量获取?
- 非 constexpr 变量模板的开销是否为零?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 是否可以使用"if constexpr"来声明具有不同类型和init-expr的变量
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 是否可以以编程方式初始化 constexpr std::array 成员
- 是否都是隐式内联的 constexpr 变量
- 是否有一种非间接、非黑客的方式来保证 constexpr 函数仅在编译时可调用?