错误:从"char*"转换为"int"在使用reinterpret_cast时会失去精度 [-fallowive] (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;
}

错误是什么意思?

错误是什么意思?

最重要的是,该消息意味着程序是病态的。语言中没有定义从类型char *到类型int的转换(在本例中)。

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

char *p = "This is a string"

这个隐式转换也是病态的。字符串字面值是const char的数组,在c++中不能隐式地转换为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;
}

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

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

最新更新