在C ++中使用static_cast强制转换为数组引用的指针合法吗?

Thomas Eding

我有一个指针T * pValues,我想将其视为T (&values)[N]

在这个SO答复https://stackoverflow.com/a/2634994/239916中,建议的实现方法是

T (&values)[N] = *static_cast<T(*)[N]>(static_cast<void*>(pValues));

我对此感到担忧。在他的示例中,pValues通过以下方式初始化

T theValues[N];
T * pValues = theValues;

我的问题是,如果pValues来自以下任一构造,则强制转换构造是否合法

1:

T theValues[N + M]; // M > 0
T * pValues = theValues;

2:

T * pValues = new T[N + M]; // M >= 0
LihO

简短的回答:你是对的。仅当pValues类型为,T[N]并且您提到的两种情况(大小不同,动态分配的数组)都很可能导致不确定的行为时,转换才是安全的


有趣的static_cast是,在编译时进行了一些额外的检查,因此,如果您似乎做错了什么,编译器会抱怨它(相比之下,丑陋的C样式强制转换几乎可以执行任何操作),例如:

struct A { int i; };
struct C { double d; };

int main() {
    A a;
    // C* c = (C*) &a; // possible to compile, but leads to undefined behavior
    C* c = static_cast<C*>(&a);
}

会给你: invalid static_cast from type ‘A*’ to type ‘C*’

在这种情况下,您将void*强制转换为,从可以在编译时进行检查的角度来看,它几乎对任何事物都是合法的,反之亦然:void*也可以强制转换为几乎所有事物,这使得使用static_cast完全没有用处因为这些检查变得毫无用处。

对于前面的示例:

C* c = static_cast<C*>(static_cast<void*>(&a));

没有比:

C* c = (C*) &a;

并很可能导致该指针的错误使用和未定义的行为


换一种说法:

A arr[N];
A (&ref)[N] = *static_cast<A(*)[N]>(&arr);

很安全,也很好。但是一旦您开始滥用行为static_cast<void*>,就无法保证会发生什么,因为即使是这样的事情:

C *pC = new C;
A (&ref2)[N] = *static_cast<A(*)[N]>(static_cast<void*>(&pC));

成为可能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C样式转换和C ++ static_cast到指针的引用

来自分类Dev

对于非指针类型,使用static_cast而不是C样式转换有什么优势吗?

来自分类Dev

为什么在不使用static_cast的情况下对const void *进行类型转换是合法的,而不是C ++中的C ++

来自分类Dev

在C ++中将布尔(false)转换为指针合法吗?

来自分类Dev

Qt / C ++:在此代码段中可以使用“ static_cast”进行转换吗?

来自分类Dev

为什么在C ++中不允许将static_cast从int(*)(int)转换为void *?

来自分类Dev

在C#中使用转换后的指针值的引用返回可以吗?

来自分类Dev

C ++指针值通过static_cast更改

来自分类Dev

C-将char数组转换为整数指针吗?

来自分类Dev

是否在glVertexAttribPointer中强制转换为void *称为合法C ++?

来自分类Dev

C ++将对基本指针的引用转换为对派生指针的引用

来自分类Dev

为什么在C ++ 11中将static_cast用于自动指针?

来自分类Dev

无法在C中使用循环而无法将char *指针转换为小写/大写char *指针

来自分类Dev

C ++ static_cast和参考

来自分类Dev

带有断言的C ++ static_cast

来自分类Dev

C ++ static_cast和参考

来自分类Dev

C ++ static_cast返回零

来自分类Dev

可以将static_cast转换为相同的类型吗?

来自分类Dev

在 C 中使用指针进行类型转换

来自分类Dev

c ++指针强制转换重载

来自分类Dev

使用unique_ptr的多态类的C ++ static_cast和dynamic_cast

来自分类Dev

C ++错误:无法将指针转换为引用(Netbeans)

来自分类Dev

C ++ 11 move(x)实际上意味着static_cast <X &&>(x)吗?

来自分类Dev

将C指针数组转换为结构的Python数组

来自分类Dev

根据C标准将函数转换为指向各种函数的指针是否合法?

来自分类Dev

在typedef函数上强制转换为const void *参数以在C中使用qsort

来自分类Dev

在typedef函数上强制转换为const void *参数以在C中使用qsort

来自分类Dev

在C ++中使用“双指针”动态数组

来自分类Dev

即使使用用户定义的转换运算符,Static_cast也拒绝将指针转换为类

Related 相关文章

  1. 1

    C样式转换和C ++ static_cast到指针的引用

  2. 2

    对于非指针类型,使用static_cast而不是C样式转换有什么优势吗?

  3. 3

    为什么在不使用static_cast的情况下对const void *进行类型转换是合法的,而不是C ++中的C ++

  4. 4

    在C ++中将布尔(false)转换为指针合法吗?

  5. 5

    Qt / C ++:在此代码段中可以使用“ static_cast”进行转换吗?

  6. 6

    为什么在C ++中不允许将static_cast从int(*)(int)转换为void *?

  7. 7

    在C#中使用转换后的指针值的引用返回可以吗?

  8. 8

    C ++指针值通过static_cast更改

  9. 9

    C-将char数组转换为整数指针吗?

  10. 10

    是否在glVertexAttribPointer中强制转换为void *称为合法C ++?

  11. 11

    C ++将对基本指针的引用转换为对派生指针的引用

  12. 12

    为什么在C ++ 11中将static_cast用于自动指针?

  13. 13

    无法在C中使用循环而无法将char *指针转换为小写/大写char *指针

  14. 14

    C ++ static_cast和参考

  15. 15

    带有断言的C ++ static_cast

  16. 16

    C ++ static_cast和参考

  17. 17

    C ++ static_cast返回零

  18. 18

    可以将static_cast转换为相同的类型吗?

  19. 19

    在 C 中使用指针进行类型转换

  20. 20

    c ++指针强制转换重载

  21. 21

    使用unique_ptr的多态类的C ++ static_cast和dynamic_cast

  22. 22

    C ++错误:无法将指针转换为引用(Netbeans)

  23. 23

    C ++ 11 move(x)实际上意味着static_cast <X &&>(x)吗?

  24. 24

    将C指针数组转换为结构的Python数组

  25. 25

    根据C标准将函数转换为指向各种函数的指针是否合法?

  26. 26

    在typedef函数上强制转换为const void *参数以在C中使用qsort

  27. 27

    在typedef函数上强制转换为const void *参数以在C中使用qsort

  28. 28

    在C ++中使用“双指针”动态数组

  29. 29

    即使使用用户定义的转换运算符,Static_cast也拒绝将指针转换为类

热门标签

归档