如何在模板数组raw_array中使用auto?编译报错‘auto不允许在此处’
问题分析与解决方案
错误原因
- 模板实参的
auto用法非法:C++标准中,别名模板的模板实参位置不允许直接使用auto(包括auto&)进行类型推导。auto作为模板实参仅能在类模板推导(CTAD)等特定场景下使用,raw_array<auto&, 5>这种写法属于语法错误,编译器无法推导auto对应的具体类型。 - 引用数组本身非法:即便忽略
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
相关产品推荐
相关产品推荐

