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