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。
1条答案
按热度按时间qpgpyjmq1#
没有任何后缀的十六进制整数文字的类型是以下列表中第一个能够表示文字的确切值的类型:
在具有32位宽
int
的系统上,int
可表示的最大值为0x7fffffff
,unsigned int
可表示的最大值为0xffffffff
。所以所有到0x7fffffff
的文字都有int
类型,从0x80000000
到0xffffffff
的文字都有unsigned int
类型。std::array
的演绎指南是以这样一种方式指定的,即如果初始化器的所有元素都不具有相同的类型,则它将失败。这就是为什么有些例子失败了。或者显式指定数组的元素类型,例如
std::array<unsigned int>
而不是std::array
,这样其他类型的初始化器将被隐式转换为指定的元素类型,或者将U
(或u
)后缀添加到您的字面量中,以强制它们始终只选择上面列表中的无符号类型。