7

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

std::array<auto, 5> myArray {

};

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

4

3 回答 3

11

auto用于从表达式中推导出一种类型。使用您建议的语法将无济于事,因为只有一种类型可以存储在容器中。如果您需要一种在容器中存储任何类型的方法,请查看boost::any,以便您可以使用

std::array<boost::any, 5> myArray;
于 2013-09-09T15:13:39.927 回答
9

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

并且为了使实际类型可推断,编译器必须有足够的信息来推断它。在您的示例中,编译器不知道auto和必须用于执行推导的数据({}列表中的初始化程序)之间的关系,这就是为什么auto在这种情况下不起作用的原因。

例如(借用评论中的例子),当你写这样的东西时

auto a[] = { 1, 2, 3, 4, 5 };

整个声明完全由核心语言结构构建而成。编译器立即知道其中的值{}是数组元素的初始值设定项,其类型由关键字描述autoauto因此,使用核心语言概念很容易定义的含义。

但是在像这样的声明中

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

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

于 2013-09-09T15:26:29.643 回答
7

为什么这是不允许的

为此,您需要一种模板方法来指定如何从对象的初始化程序中推断模板参数。这对语言来说将是一个相当大而复杂的改变,但没有什么好处。

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

不,它不会。一个数组只能包含一种类型;所有这一切都允许您从初始化程序中推断出该类型(如果它们都具有相同的类型),这是有限的用途。

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

  • 不同静态类型的对象的有序集合。这在 C++11 标准库中作为std::tuple; 或者
  • 动态类型对象的数组。语言或标准库中(目前)还没有这样的东西;但是boost::any还是boost::variant会给你这样的东西。
于 2013-09-09T15:18:34.363 回答