为什么不允许这样做,例如:
std::array<auto, 5> myArray {
};
Run Code Online (Sandbox Code Playgroud)
它会让我的生活变得如此简单,因为我可以在数组中存储多个数据类型.我确信这是一个合乎逻辑的解释,只是想知道它是什么.
cdm*_*dmh 10
auto用于从表达式中推导出一种类型.使用建议的语法无济于事,因为只有一种类型可以存储在容器中.如果您需要一种方法来存储容器中的任何类型,请查看boost::any,以便您可以使用
std::array<boost::any, 5> myArray;
Run Code Online (Sandbox Code Playgroud)
auto不是某种可以存储任何类型数据的神奇灵活数据类型.auto是一个纯粹的编译器关键字,它告诉编译器它必须自动推导出特定的类型.该类型在编译时被扣除,这意味着它auto被隐式替换为特定类型.一种特定类型.没有办法auto以某种方式帮助您在同一个数组中存储不同类型的数据.
并且为了使实际类型可以被推导,编译器必须具有足够的信息来推导它.在您的示例中,编译器不知道auto必须用于执行推导的数据({}列表中的初始化程序)之间的关系,这就是为什么auto在此上下文中不起作用的原因.
例如(从评论中借用示例),当你写这样的东西时
auto a[] = { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)
整个声明完全由核心语言结构构建.编译器立即知道值{}是数组元素的初始化器,其类型由关键字描述auto.因此,auto使用核心语言概念很容易定义其含义.
但在一个声明中
std::array<auto, 5> myArray = { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)
std::array编译器将模板视为用户定义的数据类型.{}模板参数中的值与模板参数之间的关系也是用户定义的,并隐藏在实现中std::array.它可以是任意复杂的.甚至不知道这种关系是否存在.这就是为什么通常不可能得出auto这种情况的实际类型.
为什么不允许这样做
为了实现这一点,您需要一种模板方法来指定如何从对象的初始化器推断模板参数.对于语言而言,这将是一个非常大而复杂的变化,几乎没有什么好处.
它会让我的生活变得如此简单,因为我可以在数组中存储多个数据类型.
不,它不会.一个数组只能包含一个类型; 所有这些允许你做的是从初始化者推断出那种类型(如果它们都具有相同的类型),这是有限的用途.
通常,auto表示从表达式的类型推断出的静态类型.这听起来像你想要的:
std::tuple; 要么boost::any或者boost::variant会给你这样的东西.| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |