将数组引用`T(&amp;)[n]`取为`std :: array <t,n =“”>`</t,>的内容

时间:2012-12-04 16:09:06

标签: c++ arrays reference

假设我有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());

然而,这看起来很丑陋并且可能不安全。它是合法的(明确定义的)代码,还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

标准没有提供array的底层实现,但是如果它使用int[5]作为底层表示,那么对于该实现,只有你的演员会是(非便携式)合法。对于任何其他底层表示,您违反严格别名规则并输入未定义的行为。

不是尝试将数组作为数组返回,而是使用迭代器对来界定您感兴趣的范围,遵循标准库的先例?

答案 1 :(得分:0)

C ++中的数组是一种有缺陷的类型(这里我说的是c风格的数组,而不是std::array)。这是因为数组的大小没有存储在内存中的任何地方,只有在编译时才知道。正如您将数组转换为其他类型(通常是指针)一样,数组的大小也会丢失。

现在您可以看到无法执行反向转换,因为编译器无法知道数组的大小,只查看指向第一个成员的指针。正如已经建议的那样,您可以使用一对迭代器。