C++ 为什么可以';是否将auto用作模板类型参数(例如std::array<;auto,5>;)?

C++ 为什么可以';是否将auto用作模板类型参数(例如std::array<;auto,5>;)?,c++,c++11,stl,C++,C++11,Stl,为什么不允许这样做,例如: std::array<auto, 5> myArray { }; std::array myArray{ }; 这将使我的生活更加轻松,因为我可以在数组中存储多种数据类型。我肯定有一个合乎逻辑的解释,只是想知道它是什么 auto用于从表达式推断一种类型。使用建议的语法不会有帮助,因为容器中只能存储一种类型。如果需要在容器中存储任何类型的方法,请查看boost::any,以便使用 std::array<boost::any, 5> myAr

为什么不允许这样做,例如:

std::array<auto, 5> myArray {

};
std::array myArray{ };
这将使我的生活更加轻松,因为我可以在数组中存储多种数据类型。我肯定有一个合乎逻辑的解释,只是想知道它是什么

auto
用于从表达式推断一种类型。使用建议的语法不会有帮助,因为容器中只能存储一种类型。如果需要在容器中存储任何类型的方法,请查看
boost::any
,以便使用

std::array<boost::any, 5> myArray;
std::array myArray;
为什么这是不允许的

为了实现这一点,您需要一种模板指定如何从对象的初始化器推断模板参数的方法。这对语言来说将是一个巨大而复杂的变化,几乎没有什么好处


这将使我的生活更加轻松,因为我可以在数组中存储多种数据类型

不,不会的。一个数组只能包含一个类型;所有这些都允许您从初始值设定项(如果它们都具有相同的类型)推断出该类型,这是有限的

通常,
auto
表示从表达式类型推断出的静态类型。听起来你想要:

  • 不同静态类型对象的有序集合。这在C++11标准库中作为
    std::tuple
    提供;或
  • 动态类型化对象的数组。在语言或标准库中还没有这样的东西;但我会给你这样的东西

auto
不是一种神奇灵活的数据类型,它可以存储任何类型的数据
auto
只是一个编译器关键字,它告诉编译器它必须自动推断特定类型。类型在编译时被扣除,这意味着
auto
被隐式替换为特定类型。一种特殊类型。
auto
无法帮助您在同一数组中存储不同类型的数据

为了使实际类型可以推断,编译器必须有足够的信息来推断它。在您的示例中,
auto
和必须用于执行推断的数据(
{}
列表中的初始值设定项)之间的关系对于编译器来说是未知的,这就是为什么
auto
在这种上下文中不起作用的原因

例如(借用注释中的示例),当您编写类似的内容时

auto a[] = { 1, 2, 3, 4, 5 };
整个声明完全由核心语言构造构建。编译器立即知道
{}
中的值是数组元素的初始值设定项,其类型由关键字
auto
描述。因此,使用核心语言概念很容易定义
auto
的含义

但在这样的声明中

std::array<auto, 5> myArray  = { 1, 2, 3, 4, 5 };
std::array myArray={1,2,3,4,5};

模板
std::array
被编译器视为用户定义的数据类型。
{}
中的值与模板参数之间的关系也是用户定义的,并且隐藏在
std::array
的实现中。它可以是任意复杂的。甚至不知道这种关系是否存在。这就是为什么在这种情况下通常不可能导出实际类型的
auto

“因为我可以存储多种数据类型”不,它不会
auto
不是动态输入。
auto
不允许不同的类型。我想了一会儿,因为这种误解很令人伤心。但是我取消了投票,因为它本身不是(你)不是你的错,(B)不是把这个问题当作是一个坏问题的原因。@ LeNNESS RACESEN轨道:我认为这个误解很小,因为它只有人们先学习C++(或者关于<代码> Auto <代码> >,并且很快被解释掉了。因此,我不确定这是一个主要的代码<代码>自动<代码>。我们需要<代码>动态< /代码>在C++中:所以…根据您的解释,我们可以期待新的问题:“
std::array arr{1,2,3,4,5};
工作不正常,而
auto arr[]={1,2,3,4,5};
工作正常吗?
auto arr[]={1,2,3,4,5}”;
auto
将推断类型,这是一个C样式的数组。您不能使用
auto
作为模板参数,因为编译器无法推断类型,即使每个元素都是相同的,所以只有一种类型。@cdmh:您没有真正解释它。您只是重复了该断言作为自己的解释。@sehe
{1,2,3,4,5}
不是表达式,因此它没有可推断的类型。您可以要求语言“find me a type
T
,以便
std::array arr{1,2,3,4,5}
有效,但反转
模板
类型替换是不切实际的:在一般情况下,这样做可能需要解决停止问题,这是不可能的。要实现这一点,需要一种较弱的
模板
元编程语言,或一些语法或约定来告诉该语言“正确”将构造函数参数转换成一种类型的方法:第二种方法实际上是为将来的C++标准化而工作的。我相信,你不用解释。我用苏格拉底方法来解释解释中的草率。(看它有多好,我可以问你:如果代码{{1,1,3.4},5}。不是一个表达式,那么肯定
std::vector v={1,2,3,4,5};
必须涉及聚合初始化,你不同意吗:/-I kid,尽管只有一半…)谢谢你的回复。我知道有
boost::any
等。但是,他们不允许我这样做:
cout@Phorce:
任何
都需要强制转换;
变量
元组
元素可以直接流式传输。如果你需要方便的动态类型,那么你可能没有选择最好的语言