为什么从 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*'

为什么这个转换失败?

因为intchar是基本类型,而std::string不是。

Andrei Alexandrescu 臭名昭著的示例仅适用于普通旧数据类型。

对指针起作用。转换无关指针类型的行为是未定义的。

你可以 reinterpret_cast到void*,reinterpret_cast从void*回到原来的指针类型。