c++ std::array无法自动初始化特定数据列表

yqkkidmi  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(161)

std::array无法为特定数据列表自动初始化:

static constexpr auto k_strap4_function_setting = std::array{0xf0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0xe0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0xd0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0xc0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0xb0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0xa0000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0x90000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0x80000000, 0x70000000};  // compile error
    static constexpr auto k_strap4_function_setting = std::array{0x70000000, 0x70000000};  // good to work
    static constexpr auto k_strap4_function_setting = std::array{0x60000000, 0x70000000};  // good to work
    static constexpr auto k_strap4_function_setting = std::array{0x50000000, 0x70000000};  // good to work
    static constexpr auto k_strap4_function_setting = std::array{0x40000000, 0x70000000};  // good to work

下面是错误日志:

error: no viable constructor or deduction guide for deduction of template arguments of 'array'
    static constexpr auto k_strap4_function_setting = std::array{0xf0000000, 0x70000000};

唯一的区别是“编译错误”定义的最高位是“1”。
这个错误有意义吗?
或者是std::array的bug。

qpgpyjmq

qpgpyjmq1#

没有任何后缀的十六进制整数文字的类型是以下列表中第一个能够表示文字的确切值的类型:

int
unsigned int
long
unsigned long
long long
unsigned long long

在具有32位宽int的系统上,int可表示的最大值为0x7fffffffunsigned int可表示的最大值为0xffffffff。所以所有到0x7fffffff的文字都有int类型,从0x800000000xffffffff的文字都有unsigned int类型。
std::array的演绎指南是以这样一种方式指定的,即如果初始化器的所有元素都不具有相同的类型,则它将失败。这就是为什么有些例子失败了。
或者显式指定数组的元素类型,例如std::array<unsigned int>而不是std::array,这样其他类型的初始化器将被隐式转换为指定的元素类型,或者将U(或u)后缀添加到您的字面量中,以强制它们始终只选择上面列表中的无符号类型。

相关问题