有没有什么安全和符合标准的方法可以将C样式的数组视为std::array,而无需将数据复制到新的std::array中?
这显然不能编译,但这是我想要的效果(我的实际使用更复杂,但这个简短的示例应该显示我想要做的事情)。我猜reinterpret_cast可以“工作”,但可能不安全?
#include <array>
int main()
{
int data[] = {1, 2, 3, 4, 5};
// This next line is the important one, treating an existing array as a std::array
std::array<int, 5>& a = data;
}
感觉这应该是可能的,因为数据应该以相同的方式存储。
数组编辑:明确地说,我不想清除新的std::,我想把已有的数据作为一个数组来引用。
发布于 2012-06-26 18:21:25
你不能这么做。std::array
是一个聚合,它保存自己的数据块(而不是指向可以很容易重新分配的数据块的指针)。所以没有办法避免所有元素的副本。例如,在C++11中,这一点尤其重要,因为数组的数据不能移动,因此没有有效的std::swap
函数。
发布于 2013-01-29 16:21:21
正如这篇文章中所讨论的Is std::array guaranteed to be POD if T is POD?
std::array<int, N>
是POD,因此是标准布局。就我所理解的标准布局要求而言,这意味着指向对象的指针与指向第一个成员的指针相同。由于std::array没有私有/受保护的成员(根据http://en.cppreference.com/w/cpp/container/array),这应该与包装数组中的第一个元素一致。因此像这样的东西
reinterpret_cast< std::array<int, 5>* >( &data )
在我看来,这个标准保证了它的有效性。不过,我必须承认,有时我在解释标准语言时会遇到困难,所以如果我错了,请纠正我。
关于Claas
发布于 2012-06-26 18:24:38
您可以使用reinterpret_cast,,但是请注意,它是一个丑陋、肮脏的黑客攻击,您不应该在您的实际发布代码中做这样的事情:
std::array<int, 5> &a = reinterpret_cast<std::array<int, 5>&>(data);
如果STL std::array的内部实现发生变化(例如,将在的调试版本中添加一些额外的字段以执行一些运行时检查),则可能会出现问题。然后,这段代码将在没有任何信息性消息的情况下开始崩溃(因为它基于一个隐含的假设,即std::array对象和C数组具有相同的内存布局)。
如果你仍然决定使用丑陋的破解方法,至少要添加一个编译时大小检查:
C_ASSERT(sizeof(a) == sizeof(data));
这将在std::array<>的大小与C数组的大小不匹配的情况下产生错误(由于STL实现中的一些更改)。
https://stackoverflow.com/questions/11205186
复制相似问题