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

std::array couldn't be auto initialized for a certain data list

提问人:sparrow 提问时间:6/5/2023 最后编辑:greybeardsparrow 更新时间:6/5/2023 访问量:63

问:

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 的错误。

c++ 编译器错误 c++20 stdarray

评论

3赞 康桓瑋 6/5/2023
0x80000000是 ,是 。unsigned int0x70000000int
0赞 Pepijn Kramer 6/5/2023
你希望你的数组是什么类型?您可以控制它,例如 将使您的类型成为无符号长整型。0xf000000ul
0赞 greybeard 6/5/2023
(令我惊讶的是,不止一个声明和初始化是好的k_strap4_function_setting
0赞 sparrow 6/19/2023
@greybeard,寄存器不是一起定义的,我只是将其复制在一起。
0赞 sparrow 6/19/2023
@PepijnKramer,是的,我正在使用这种方式(添加后缀**ul)

答:

1赞 user17732522 6/5/2023 #1

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

int
unsigned int
long
unsigned long
long long
unsigned long long

在宽度为 32 位的系统上,可表示的最大值为 为 ,可表示的最大值为 。所以所有的文字都是有类型的,而那些从有类型。intint0x7fffffffunsigned int0xffffffff0x7fffffffint0x800000000xffffffffunsigned int

的演绎指南的指定方式是,如果不是初始值设定项的所有元素都具有相同的类型,它将失败。这就是为什么你的一些例子失败了。std::array

显式指定数组的元素类型,例如 而不是 ,以便具有其他类型的初始值设定项将隐式转换为指定的元素类型,或者在文本中添加(或)后缀以强制它们始终仅从上面的列表中选择无符号类型。std::array<unsigned int>std::arrayUu