用std/tr1/boost :: array替换内置数组总是安全的吗?

Mar*_* Ba 5 c++ arrays refactoring boost visual-c++

boost::array(或tr1std版本)提供了一个内置的阵列一些不错的附加功能.

到目前为止,我们的代码库只包含内置数组(例如(组合,但样式匹配):

WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
  memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
  ...
Run Code Online (Sandbox Code Playgroud)

我想有人会明白这个想法.

现在,我的问题是,对于代码中的那些位置,丢入是boost::array有意义的(因为进行了其他更改),是否array为内置数组保留了100%语义?(可能的编译器错误是正常的 - 只有沉默的行为改变才会让我烦恼.)

即,可以上面的代码被重写(例如)使用方法:

boost::array<WORD, FLAGS_MAX> m_lastReadFlags;
Run Code Online (Sandbox Code Playgroud)

memcpy(可能适合使用c_array()data())和其他类似数组的访问将保持不变?是的,当然我也可以通过阵列替换本地缓存和删除memcpy或使用std::copy或类似的东西,但这个问题的关键是有关内置阵列的兼容性和数组类.


更新:特别困扰我的一件事是memcpy内置数组用作指针的地方(就像在这种情况下一样).是否所有出现都会被编译器捕获/正确处理?

任务怎么样?

T arr1[N]; // or array<T, N>
T arr2[N]; // or array<T, N>
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

是的,这应该没问题,因为array该类恰好是自动数组的包装器.它具有相同的访问语法和方括号,如果你需要获取指针,你知道如何做到这一点.你甚至可以std::copy在任何地方使用并使用迭代器; memcpy无论如何都有机会实现.

array类是聚合类型(无非平凡的构造/析/分配),所以可以与传统的集合体(括号)初始化初始化它,就像普通数组.