假设我有std::array<T, n>
并希望对其内容(即未曝光的elems
数组成员)进行数组引用。
我很惊讶地发现std::array<T, n>::data()
返回T *
而不是T (&)[n]
,因此似乎需要进行某种投射。我可以写:
std::array<int, 5> arr;
int (&ref)[5] = *reinterpret_cast<int (*)[5]>(arr.data());
然而,这看起来很丑陋并且可能不安全。它是合法的(明确定义的)代码,还有更好的方法吗?
答案 0 :(得分:3)
标准没有提供array
的底层实现,但是如果它使用int[5]
作为底层表示,那么对于该实现,只有你的演员会是(非便携式)合法。对于任何其他底层表示,您违反严格别名规则并输入未定义的行为。
不是尝试将数组作为数组返回,而是使用迭代器对来界定您感兴趣的范围,遵循标准库的先例?
答案 1 :(得分:0)
C ++中的数组是一种有缺陷的类型(这里我说的是c风格的数组,而不是std::array
)。这是因为数组的大小没有存储在内存中的任何地方,只有在编译时才知道。正如您将数组转换为其他类型(通常是指针)一样,数组的大小也会丢失。
现在您可以看到无法执行反向转换,因为编译器无法知道数组的大小,只查看指向第一个成员的指针。正如已经建议的那样,您可以使用一对迭代器。