将 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];

它确实按预期工作,但我不太确定应该如何编写它。

问题:

这是constexpr从正确写入的数组中读取一个 32 位整数吗?

我不能从 'language-lawyer' 的角度说话,但是您给出的 constexpr 在以下代码中编译时没有警告,MSVCclang-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("%08X\n", address);
    return 0;
}

进一步,输出的是期望值(22AA11BB)。