首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将C cstyle数组视为std::array

将C cstyle数组视为std::array
EN

Stack Overflow用户
提问于 2012-06-26 18:17:41
回答 3查看 9.9K关注 0票数 30

有没有什么安全和符合标准的方法可以将C样式的数组视为std::array,而无需将数据复制到新的std::array中?

这显然不能编译,但这是我想要的效果(我的实际使用更复杂,但这个简短的示例应该显示我想要做的事情)。我猜reinterpret_cast可以“工作”,但可能不安全?

代码语言:javascript
复制
#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::,我想把已有的数据作为一个数组来引用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-26 18:21:25

你不能这么做。std::array是一个聚合,它保存自己的数据块(而不是指向可以很容易重新分配的数据块的指针)。所以没有办法避免所有元素的副本。例如,在C++11中,这一点尤其重要,因为数组的数据不能移动,因此没有有效的std::swap函数。

票数 12
EN

Stack Overflow用户

发布于 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

票数 26
EN

Stack Overflow用户

发布于 2012-06-26 18:24:38

您可以使用reinterpret_cast,,但是请注意,它是一个丑陋、肮脏的黑客攻击,您不应该在您的实际发布代码中做这样的事情:

代码语言:javascript
复制
std::array<int, 5> &a = reinterpret_cast<std::array<int, 5>&>(data);

如果STL std::array的内部实现发生变化(例如,将在的调试版本中添加一些额外的字段以执行一些运行时检查),则可能会出现问题。然后,这段代码将在没有任何信息性消息的情况下开始崩溃(因为它基于一个隐含的假设,即std::array对象和C数组具有相同的内存布局)。

如果你仍然决定使用丑陋的破解方法,至少要添加一个编译时大小检查:

代码语言:javascript
复制
    C_ASSERT(sizeof(a) == sizeof(data));

这将在std::array<>的大小与C数组的大小不匹配的情况下产生错误(由于STL实现中的一些更改)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11205186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档