为什么从 int 转换为 char* 不同于从 std::string 转换为 char*?
Why is converting from int to char* different from converting from std::string to char*?
我正在学习 C++ 并阅读 Andrei Alexandrescu 关于泛型编程的书。他提出了一个模板化的 class 可以用来在类型之间进行转换:
template <class To, class From>
To safe_reinterpret_cast(From from)
{
assert(sizeof(From) <= sizeof(To));
return reinterpret_cast<To>(from);
}
这适用于:
int i = 5;
char* p = safe_reinterpret_cast<char*>(i);
但失败了
std::string a("apple");
char* pp = safe_reinterpret_cast<char*>(a);
这是编译时的错误失败:
invalid cast from type 'std::basic_string<char>' to type 'char*'
为什么这个转换失败?
因为int
和char
是基本类型,而std::string
不是。
Andrei Alexandrescu 臭名昭著的示例仅适用于普通旧数据类型。
它不对指针起作用。转换无关指针类型的行为是未定义的。
你可以只 reinterpret_cast到void*
,reinterpret_cast从void*
回到原来的指针类型。
我正在学习 C++ 并阅读 Andrei Alexandrescu 关于泛型编程的书。他提出了一个模板化的 class 可以用来在类型之间进行转换:
template <class To, class From>
To safe_reinterpret_cast(From from)
{
assert(sizeof(From) <= sizeof(To));
return reinterpret_cast<To>(from);
}
这适用于:
int i = 5;
char* p = safe_reinterpret_cast<char*>(i);
但失败了
std::string a("apple");
char* pp = safe_reinterpret_cast<char*>(a);
这是编译时的错误失败:
invalid cast from type 'std::basic_string<char>' to type 'char*'
为什么这个转换失败?
因为int
和char
是基本类型,而std::string
不是。
Andrei Alexandrescu 臭名昭著的示例仅适用于普通旧数据类型。
它不对指针起作用。转换无关指针类型的行为是未定义的。
你可以只 reinterpret_cast到void*
,reinterpret_cast从void*
回到原来的指针类型。