为什么在模板函数中不允许使用 auto 来创建内置数组?

Mic*_*hal 3 c++ templates auto c++11 c++17

下面的代码无法编译:

template<typename... Ts>
void CreateArr(const Ts&... args)
{
    auto arr[sizeof...(args) + 1]{ args... };
}

int main()
{
    CreateArr(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

由于以下错误:

  • 'arr':在直接列表初始化上下文中, for 的类型'auto [6]'只能从单个初始化表达式推导
  • auto [6]':数组的元素类型不能包含'auto'
  • “正在初始化”:无法从 转换'const int''std::initializer_list<int>'

我的问题是:

  • 为什么我不能使用auto来定义数组的类型?

  • 如何正确定义它以与模板一起使用?

JeJ*_*eJo 8

为什么我不能使用auto来定义数组的类型?

出于同样的原因,以下行为无效/不允许!

auto ele[]{ 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

更多阅读:为什么我不能创建自动变量数组?


如何正确定义它以与模板一起使用?

使用std::common_type_t来指定类型

#include <type_traits> //  std::common_type_t

template<typename... Ts>
void CreateArr(const Ts&... args) 
{
    std::common_type_t<Ts...> arr[sizeof...(args)]{ args... };
   
    static_assert(std::is_array_v<int[sizeof...(args)]>, "is not array!");
}
Run Code Online (Sandbox Code Playgroud)

参见现场演示