首页 > 解决方案 > 错误:在使用 reinterpret_cast (C++) 时,从 'char*' 转换为 'int' 会失去精度 [-fpermissive]

问题描述

我正在尝试 C++ 中的不同类型转换运算符。在我对 reinterpret_cast 的理解中,它将不类型转换为根本不同的类型。但是下面的代码会抛出这个错误“从 'char*' 转换为 'int' 失去精度 [-fpermissive]”。

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
    int i;
    char *p = "This is a string";
    i = reinterpret_cast<int>(p);
    cout << i;
    return 0;
}

错误是什么意思?

标签: c++castingreinterpret-cast

解决方案


错误是什么意思?

最重要的是,该消息意味着程序格式错误。语言中没有定义从类型char *到类型的转换int(在这种情况下)。

该消息还包含“失去精度”的额外细节。由此我们可以推断,指针类型可表示的内存地址比整数类型可表示的数字多(在 C++ 语言的这个特定实现中)。这个细节是不允许转换的原因。仅在整数可以表示指针类型的所有可能值的情况下才定义从指针到整数的重新解释转换。在存在这种整数类型的语言实现中,标准库中的类型有一个类型别名:std::uintptr_t

char *p = "This is a string"

这种隐式转换也是格式错误的。一个字符串文字,它是一个数组,在 C++ 中const char是不可隐式转换的char*(自 C++11 起;在此之前,这种转换是允许的,但已弃用)。


您能否提供一段正确使用 reinterpret_cast 的代码片段?

reinterpret_cast 的正确使用极为罕见。它的使用有许多规则限制,为了能够编写正确的程序,您必须了解所有相关规则及其微妙之处。

我可以举个例子,但你必须明白,做出任何改变,无论多么微妙,都极有可能产生错误的程序。这是一个例子,正如承诺的那样:

struct standard_layout_struct {
    int first_member;
};

int main() {
    standard_layout_struct  instance { .first_member=42 };
    standard_layout_struct* pointer_to_instance = &instance;
    int* pointer_to_member = reinterpret_cast<int*>(pointer_to_instance);
    std::cout << *pointer_to_member;
}

推荐阅读