static_cast
正如其他人所指出的,将做正确的事。它比 C 风格的强制转换弱,因此不太可能造成破坏并导致未定义的行为。
reinterpret_cast
也弱于 C 风格的强制转换,但并不严格地强于static_cast
; 有些事情static_cast
可以做而reinterpret_cast
不能。你遇到了其中之一。
reinterpret_cast
旨在允许您获取一种类型的值,将它们存储为另一种类型的值,然后取回原始类型。您可以这样做来转换兼容的整数和指针类型。您可以使用它从一种指针类型转换为另一种指针类型并再次转换回来。
通常, areinterpret_cast
会将您的值转换为“持有”值,并且持有值最多是实现定义的,并且经常使用它是未定义的行为。
所以你要避免使用它,除非你真的是认真的。
将 a 转换char
为 anint
通常不需要重新解释。
static_cast<int>(some_char)
将升级char
到 anint
并为您提供适当的值。
但是,在某些情况下,我觉得static_cast
太强大了。它可以进行不安全的指针转换,并算作显式转换。
这两者都可以伪装错误。
您可以编写一个严格较弱的演员表,如下所示:
template<class T, class U>
T implicit_cast( U&& u ) { return std::forward<U>(u); }
现在你可以
std::cout << implicit_cast<int>(v[0]) << std::endl;
你得到的行为非常像调用一个int
带char
参数的函数,我相信这就是你想要的。
这里出了什么问题?嗯,std::cout
是一个流,而流注意传递的类型。 char
类型被打印为好像它们是 `'a` 样式字符,而不是好像它们是小整数。
为了将 achar
视为一个小整数,您必须将其转换为另一种整数类型。
也是如此char*
;它们被视为指向char
、 like的空终止缓冲区的"hello world"
指针,而不像其他指针。