C++ 在C+中使用静态强制转换将指针强制转换为数组引用合法吗+;?

C++ 在C+中使用静态强制转换将指针强制转换为数组引用合法吗+;?,c++,arrays,casting,type-safety,static-cast,C++,Arrays,Casting,Type Safety,Static Cast,我有一个指针T*pValues,我想将其视为T(&values)[N] 在这个答案中,建议的方法是 T (&values)[N] = *static_cast<T(*)[N]>(static_cast<void*>(pValues)); 我的问题是,如果pValues来自以下任一构造,则强制转换构造是否合法: 1: 2: 简短回答:你是对的。只有pValues类型为T[N]且您提到的两种情况(大小不同,动态分配数组)都很可能导致未定义的行为时,强制转换才是安全的

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

在这个答案中,建议的方法是

T (&values)[N] = *static_cast<T(*)[N]>(static_cast<void*>(pValues));
我的问题是,如果
pValues
来自以下任一构造,则强制转换构造是否合法:

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


static\u cast
的好处在于,在编译时会进行一些额外的检查,因此,如果您似乎做了一些错误的事情,编译器会对此进行抱怨(与丑陋的C风格cast相比,它允许您做几乎任何事情),例如:

不比:

C* c = (C*) &a;
并且极有可能导致此指针的错误使用和未定义的行为


换言之:

A arr[N];
A (&ref)[N] = *static_cast<A(*)[N]>(&arr);
A arr[N];
A(&ref)[N]=*静态施法(&arr);
是安全的,还不错。但是一旦你开始滥用
static\u cast
就根本无法保证会发生什么,因为即使是这样的事情:

C *pC = new C;
A (&ref2)[N] = *static_cast<A(*)[N]>(static_cast<void*>(&pC));
C*pC=newc;
A(&ref2)[N]=*静态演员阵容(静态演员阵容(&pC));

成为可能。

*static_cast(static_cast(pValues))
似乎滥用了语言的功能,这是一个丑陋的解决办法,而不是您实际想要使用的东西……您在1和2中的内存都是动态的-也就是说,指针是指向内存块起点的实际指针,不是已衰减为指针的数组。看起来应该是UB。好吧,但这并不能完全回答我的问题,因为您正在介绍两种类型(A和C),而我要问的是一种情况,其中涉及一种(非指针非引用)类型t。根据标准,IMHO静态强制转换为无效*应该是非法的。
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);
}
C* c = static_cast<C*>(static_cast<void*>(&a));
C* c = (C*) &a;
A arr[N];
A (&ref)[N] = *static_cast<A(*)[N]>(&arr);
C *pC = new C;
A (&ref2)[N] = *static_cast<A(*)[N]>(static_cast<void*>(&pC));