You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写C++函数模板返回包含传入参数的同类型原生数组

错误原因

  1. C++ 语法不允许函数直接返回原生数组类型,原生数组作为返回值时会自动退化为对应元素类型的指针。你原代码中的函数甚至没有写返回值语句,auto 无法推导返回类型,即使补充返回语句,返回的指针也无法用于初始化原生数组。
  2. 原生数组只能用大括号包裹的初始化列表完成初始化,不支持直接用函数返回值做整体初始化,这就是你收到array must be initialized with a brace-enclosed initializer报错的直接原因。

解决方案

方案1:输出参数实现(最稳妥,无额外依赖)

直接将目标数组作为引用参数传入函数赋值,完全使用原生数组语法,不引入任何标准库容器:

template<typename T>
void encArr(T obj, T (&out_arr)[1]) {
    out_arr[0] = obj;
}

调用示例:

int test_val = 10;
int arr[1];
encArr(test_val, arr);
// 此时arr[0]已被赋值为10

方案2:结构体包装返回(支持返回值形式调用)

将原生数组包裹在可值返回的结构体中,保留返回值调用的习惯:

template<typename T>
struct ArrayWrap {
    T data[1];
};

template<typename T>
ArrayWrap<T> encArr(T obj) {
    return {{obj}};
}

调用示例:

int test_val = 10;
// 直接用返回值初始化数组
int arr[1] = {encArr(test_val).data[0]};

// C++17及以上版本可直接用结构化绑定拿到原生数组
auto [res_arr] = encArr(test_val);
// res_arr 就是类型为int[1]的原生数组,res_arr[0] = 10

内容的提问来源于stack exchange,提问作者Anton Adamson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:09:03