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

如何在模板数组raw_array中使用auto?编译报错‘auto不允许在此处’

问题分析与解决方案

错误原因

  1. 模板实参的auto用法非法:C++标准中,别名模板的模板实参位置不允许直接使用auto(包括auto&)进行类型推导。auto作为模板实参仅能在类模板推导(CTAD)等特定场景下使用,raw_array<auto&, 5>这种写法属于语法错误,编译器无法推导auto对应的具体类型。
  2. 引用数组本身非法:即便忽略auto的问题,raw_array<T, N>本质是T[N],当T为引用类型时,会形成引用数组,而C++明确禁止引用作为数组元素——因为引用不是对象,数组元素必须是可存储的对象类型。

解决方案

根据你的需求分两种情况处理:

场景1:创建普通对象数组,明确指定或推导类型

如果你只是想创建一个包含5个某类型对象的数组,直接明确指定模板参数T的类型即可:

// 明确指定T为int,创建int[5]数组
auto&& z = raw_array<int, 5>{};
// 或者初始化时提供元素,让编译器确认类型
auto&& z = raw_array<int, 5>{1, 2, 3, 4, 5};

场景2:需要存储多个引用(指向其他对象)

由于无法直接创建引用数组,改用std::reference_wrapper包装引用,配合std::array实现类似效果:

#include <functional>
#include <array>

// 定义存储引用的数组别名模板
template<typename T, int N>
using ref_array = std::array<std::reference_wrapper<T>, N>;

int a = 1, b = 2, c = 3, d = 4, e = 5;
// 创建包含5个int引用的数组
auto&& z = ref_array<int, 5>{a, b, c, d, e};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:12:38