static_cast
将像其他人所指出的那样执行正确的操作。它比C风格的转换要弱,因此不太可能造成损害并导致未定义的行为。
reinterpret_cast
也比C风格的转换要弱,但它并不严格比static_cast
更强大;static_cast
可以做到的事情,reinterpret_cast
不能。您已经遇到其中之一。
reinterpret_cast
旨在允许您将一个类型的值存储为另一个类型的值,然后再返回原始类型。您可以使用此方法在兼容的整数和指针类型之间进行转换。您可以使用此方法在指针类型之间进行转换,然后再进行转换。
通常而言,reinterpret_cast
将您转换为“保持”值,该保持值最好是实现定义的,而经常使用它是未定义的行为。
因此,除非您确实需要这样做,否则请避免使用它。
将char
转换为int
通常不是重新解释的问题。
static_cast<int>(some_char)
将会将 char
升级为 int
并获取相应的值。
然而,在某些情况下,我发现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;
你会得到非常类似于调用一个带有 char
参数的 int
函数的行为,我相信这正是你想要的。
这里出了什么问题?嗯,std::cout
是一个流,而流会注意传递的类型。 char
类型被打印成像 `'a` 样式字符一样,而不是像小整数一样。
为了将 char
视为小整数,您必须将其转换为另一种整数类型。
char*
也是如此;它们被视为指向以 null 结尾的缓冲区的指针,例如 "hello world"
,而不是像其他指针一样。
static_cast
代替,应该能正常工作。 - Neel Basuunsigned char
到int
的转换是完全定义良好的。 - Ed S.