std::array不支持直接用原生数组初始化,需用std::copy、std::memcpy或模板函数转换;必须显式保证长度匹配,否则行为未定义。

std::array 的构造不支持直接从原生数组初始化
你不能写 std::array<int> a = {arr}</int> 或 std::array<int> a(arr)</int> —— 这会编译失败。因为 std::array 是聚合类型,其默认构造器不接受原始指针或数组引用作为参数,也没有隐式转换或重载的构造函数来接收 C 风格数组。
用 std::copy 最安全、最通用
这是推荐做法,尤其当你已知原生数组长度且与 std::array 容量匹配时:
int arr[] = {1, 2, 3};
std::array<int> a;
std::copy(std::begin(arr), std::end(arr), a.begin());
</int>
- 必须确保源数组长度 ≤
std::array容量,否则越界写入(std::copy不检查目标空间) - 适用于任意可迭代源(包括
std::vector、另一个std::array) - 编译器通常能将它优化为 memcpy 级别指令,性能无损
- 头文件只需
<algorithm></algorithm>和<array></array>
用 std::memcpy 需手动校验类型和对齐
如果你确定元素是 trivially copyable(如 int、float、POD 结构),且两端内存布局完全一致,可用 memcpy:
int arr[] = {1, 2, 3};
std::array<int> a;
std::memcpy(a.data(), arr, sizeof(arr));
</int>
- 必须保证
sizeof(arr) == a.size() * sizeof(int),否则行为未定义 - 不能用于含非平凡构造/析构函数的类型(比如
std::string成员) - 比
std::copy少一层抽象,但可读性差、易出错,仅在极致性能敏感且可控场景下考虑
模板辅助函数可避免重复写 std::copy
若频繁做这类拷贝,封装一个函数更清晰:
template <typename t size_t n>
constexpr std::array<t n> to_std_array(const T (&a)[N]) {
std::array<t n> result{};
std::copy(a, a + N, result.begin());
return result;
}
// 用法:
auto a = to_std_array(arr); // 类型和大小自动推导
</t></t></typename>
- 返回值是
constexpr,支持编译期计算(前提是源数组也是字面量) - 注意:不能传入指针(如
int*),只能传数组引用,否则模板推导失败 - 如果源数组长度未知(比如函数参数里是
int*),这个函数就不可用——这时候你得自己管理长度
C++ 没有“自动桥接”原生数组和 std::array 的语法糖,关键点始终是:长度匹配必须由程序员显式保证,编译器不会帮你查漏。最容易被忽略的是把局部数组地址传给函数后,在函数内误用 sizeof 得到指针大小而非数组大小。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











