我有一个C ++函数,其中一个输入参数的类型为char const* buffer
。我理解它的方式是可以更改此数组的基础值,但指针本身不能移动到指向其他位置。
现在我要做的是将这个数组重新解释为unsigned short
并进行一些操作。所以,我做了类似的事情:
char const * current = &buffer[currentLine]; // Points to some location
unsigned short * const values = static_cast<unsigned short * const>(current);
// Change some of these values
这会产生invalid cast from top char * const to type short unsigned int * const
。
如何进行演员表?
答案 0 :(得分:2)
我理解它的方式是这个数组的基础值 可以更改,但指针本身不能移动到指向 别的什么。
不。这意味着您无法更改此指针指向的实体,但您可以更改指针本身。要禁止更改指针,必须使指针本身const
:
const char* const buffer;
^^^^^
如何进行演员表?
应使用reinterpret_cast执行转换。
只有使用reinterpret_cast才能进行以下转换,除非此类转换会丢弃常量或波动。
...
5)任何指向T1类型对象的指针都可以转换为指向另一种类型cv T2的对象的指针。
所以你必须写:
unsigned short * const values = reinterpret_cast<unsigned short * const>(current);
甚至:
decltype(auto) values = reinterpret_cast<unsigned short * const>(current);
最后,static_cast在这里不适用,因为您尝试在不同的不相关指针类型之间执行转换。
答案 1 :(得分:2)
为了帮助您确保类型安全,每个演员都有一组有限的转换。这允许您帮助传达您打算使用强制转换的内容,如果您不小心预先形成了无意的转换,编译器会发出警告。
static_cast
是一个相对安全的演员。它允许最常见和最安全的转换,包括已经隐式允许的转换。这不包括在不相关的指针类型之间进行转换,这通常很危险。要使用的正确强制转换运算符为reinterpret_cast
。如果要将某些内存解释为给定类型,则使用reinterpret_cast
,而不管内存实际表示的对象类型如何。除此之外,它还可以在不相关的指针类型之间进行转换时使用。
请记住,在给出选择权时,总是首选使用限制性最强的演员操作员来完成您需要完成的工作。如果你犯了错误,这将给编译器提供最多通知你的机会。
请注意,您正在指针类型之间进行转换。重要的是不要混淆两种类型之间的转换以及在两种指针之间进行转换。在char
和unsigned short
之间进行转换的方式与将指针转换为char
和指针转换为{{}的方式不同1}}。