C++ boost::uint32\u t!=标准::用于ARM目标的uint32_t

C++ boost::uint32\u t!=标准::用于ARM目标的uint32_t,c++,boost,arm,C++,Boost,Arm,从OS X交叉编译到ARM时,以下程序无法编译: #include <boost/cstdint.hpp> #include <cstdint> #include <type_traits> static_assert(std::is_same<std::uint32_t, boost::uint32_t>::value, ""); int main() { } 在哪里 为了尝试进一步诊断问题,我尝试了以下技巧: template <t

从OS X交叉编译到ARM时,以下程序无法编译:

#include <boost/cstdint.hpp>
#include <cstdint>
#include <type_traits>

static_assert(std::is_same<std::uint32_t, boost::uint32_t>::value, "");

int main() { }
在哪里

为了尝试进一步诊断问题,我尝试了以下技巧:

template <typename T> struct show;
using A = show<std::uint32_t>::invalid;
using B = show<boost::uint32_t>::invalid;

我觉得这种情况非常令人惊讶。
uint32\u t
是否应该始终表示完全相同的类型(32位无符号整数),而不管我们在哪个系统上?这是Boost中的一个bug还是我误解了什么?

uint32\u t
应该始终表示一个32位宽度的无符号整数,是的


但是
sizeof(long unsigned int)==sizeof(unsigned int)
完全有可能为真。这两种类型可以具有相同的宽度。

不能保证两个32位无符号整数值是相同的类型


事实上,
long
int
可以是不同的类型,它们可以同时是32位值。对于16位值的
wchar\u t
short
也是如此。

多种类型可以表示32位无符号整数。这只是C++中的一个方面。“不应该<代码> UTIT32×T < /COD>总是代表完全相同的类型(32位宽度无符号整数),而不管我们在哪个系统上使用“N.B.它甚至不需要存在于所有系统上!它只存在于一种类型正好为32位的系统上
uint\u至少32\u t
始终存在,但可能大于32位。啊,是的,当然。然后,我认为这只是Boost中的一个QOI问题,
Boost::uint32\u t
并不总是与
std::uint32\u t
相同,因为这使得两者之间的互操作更加困难。作为参考,我跟踪了邮件列表中关于这个问题的内容。除了明确的专业化不匹配和混乱之外,你面临的问题是什么@louisdionne@Yakk从某个函数指针
void(*)(boost::uint32\u t)
void(*)(std::uint32\u t)
的转换无效。谢谢您的回答。我会接受奥尔普的答案,因为它排在第一位,但你的答案同样好。
> arm-none-eabi-g++ --version
arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) 
[ARM/embedded-4_9-branch revision 224288]
template <typename T> struct show;
using A = show<std::uint32_t>::invalid;
using B = show<boost::uint32_t>::invalid;
main.cpp:8:32: error: 'invalid' in 'struct show<long unsigned int>' does not name a type
 using A = show<std::uint32_t>::invalid;
                                ^
main.cpp:9:34: error: 'invalid' in 'struct show<unsigned int>' does not name a type
 using B = show<boost::uint32_t>::invalid;