在我的平台上,long int和long long int都是相同的(64位)。我有一个指向long int的指针,想要把它转换为指向long long int的指针。以下是代码:
static_cast<long long int*>(pointer);
不允许使用该方法。在C++11中,正确的方法是什么?
您需要强制“重新解释”指针:
reinterpret_cast<long long int*>(pointer);
reinterpret_cast
时,请仔细检查您对平台、内存对齐等方面的了解。编写一些简单的单元测试,通过valgrind或地址sanitizer运行它们。template <typename Dest, typename Src>
Dest* safe_pointer_cast(Src* src)
{
static_assert(sizeof(Src) == sizeof(Dest), "size of pointed values differ");
static_assert(alignof(Src) == alignof(Dest), "alignment different");
return reinterpret_cast<Dest*>(src);
}
您可以通过额外的存储空间以便携方式完成此操作:
long* ptr = /***/;
long long extra_storage = *ptr;
long long* long_ptr = &extra_storage;
没有额外的存储空间,但有编译时检查:
static_assert(sizeof(long) == sizeof(long long));
long* ptr = /***/;
long long* long_ptr = reinterpret_cast<long long*>(ptr);
long_ptr
是 extra_storage
变量的 _地址_,而不是它的值。 - DarkDust
static_assert
来确保它们具有相同的大小。 - Hcorglong
和long long
的大小相同,它们也不是相同的类型。你认为的“安全”在大多数情况下都是错误的。因此,你需要明确告诉编译器你知道自己在做什么。 - molbdnilostatic_cast
在此处不被允许的原因是因为它不能被视为语言上的安全(本质上是多平台的)。因为这种构造可能是非法的,所以语言要求static_cast
失败,编译器无法(甚至不应该)对此做任何事情。 - DevSolar