error: cast from 'char*' to 'int' loses precision [-fpermissive] on using reinterpret_cast (C++)

error: cast from 'char*' to 'int' loses precision [-fpermissive] on using reinterpret_cast (C++)

我正在尝试 C++ 中的不同转换运算符。 根据我对 reinterpret_cast 的理解,它将 don't type 转换为根本不同的类型。 但是下面的一段代码抛出了这个错误“从 '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;
}

错误是什么意思?

What does the error mean?

最重要的是,该消息表示程序格式错误。从类型 char * 到类型 int 的转换未在语言中定义(在本例中)。

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

char *p = "This is a string"

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


Can you please provide a snippet of code where reinterpret_cast is used correctly?

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;
}

要将字符串转换为值,类型转换不起作用。 输入字符串需要被解析,标准库可以像这样为你做这件事:

#include <iostream>
#include <string>

int main()
{
    std::string str{ "42" };
    auto value = std::stoi(str);
    std::cout << value;
    return 0;
}