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 typeT
,以便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:任何
都需要强制转换;变量
或元组
元素可以直接流式传输。如果你需要方便的动态类型,那么你可能没有选择最好的语言