gpt4 book ai didi

c++ - 在 C++ 中使用 static_cast 转换指向数组引用的指针是否合法?

转载 作者:IT老高 更新时间:2023-10-28 22:21:51 25 4
gpt4 key购买 nike

我有一个指针 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

最佳答案

简短的回答:你是对的。仅当 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));

成为可能。

关于c++ - 在 C++ 中使用 static_cast 转换指向数组引用的指针是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com