【发布时间】:2014-01-23 19:03:32
【问题描述】:
我有一个指针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
【问题讨论】:
-
*static_cast<T(*)[N]>(static_cast<void*>(pValues))似乎在滥用语言的功能,而不是您真正想要使用的东西,而是一种丑陋的解决方法...... -
您在 1 和 2 中的内存都是动态的 - 也就是说,指针是指向内存块起点的实际指针,而不是已衰减为指针的数组。好像是UB。
标签: c++ arrays casting type-safety static-cast