6

假设我有一个std::array<T, n>并且想要对其内容(即非公开的elems数组成员)进行数组引用。

我很惊讶地发现std::array<T, n>::data()returnT *而不是T (&)[n],所以似乎某种演员表是必要的。我可以写:

std::array<int, 5> arr;
int (&ref)[5] = *reinterpret_cast<int (*)[5]>(arr.data());

但是,这看起来很丑陋并且可能不安全。它是合法的(定义明确的)代码吗?有没有更好的方法来做到这一点?

4

2 回答 2

3

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

除了尝试将数组作为数组返回之外,您是否可以使用迭代器对来界定您感兴趣的范围,遵循标准库的先例?

于 2012-12-04T16:37:02.490 回答
0

C++ 中的数组是有缺陷的类型(这里我说的是 c 风格的数组,而不是std::array)。原因是数组的大小没有存储在内存中的任何位置,它仅在编译时才知道。当您将数组转换为其他类型(通常是指针)时,数组的大小会丢失。

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

于 2012-12-04T16:56:13.627 回答