为什么我不能创建一个自动变量数组?

Raj*_*pal 14 c++ declaration c++11

在C++ 0x(哦!读取C++ 11)中,我们有自动类型推断.令我好奇的一件事是我无法创建一系列自动变量.例如:

auto A[] = {1, 2, 3, 4}; // Error!
Run Code Online (Sandbox Code Playgroud)

有什么想法可能被禁止了吗?

pmr*_*pmr 10

auto将每个大括号括起来的初始化列表推断为a std::initializer_list<T>.(参见§7.1.6.4.6,包括示例).不幸的是,你不能初始化数组,甚至std::array从一个std::initializer_list一旦你得到它,但你可以使用std::vector.

#include <vector>
#include <array>
#include <initializer_list>

int main()
{
  auto x = {1,2,3};
  std::array<int, 3> foo1 = x; // won't work for whatever reason
  std::vector<int> foo2 = x; // works as expected
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,这会破坏你想要做的事情的全部目的.

我尝试编写一个调用的工作,make_array但必须意识到这不能工作,因为a的大小initializer_list不是它的模板参数的一部分,所以你只make_array为每个实例化一个模板T.这很糟糕.

template<typename T> 
auto make_array(const std::initializer_list<T>& x) 
     -> std::array<T, x.size()> { } // maaah
Run Code Online (Sandbox Code Playgroud)

好吧,显然你可以选择这里提到的可变参数模板黑客如何用initializer_list初始化一个成员数组?


Pup*_*ppy 5

因为{1, 2, 3, 4}它纯粹是一个句法结构 - 它不是一个表达式,也没有一个类型.因此,auto不能从中推断出它的类型.

  • 但是`auto x = {1,2}`将`x`声明为`std :: initializer_list <int>`.所以这不完全正确. (4认同)
  • 这样的耻辱,我知道多年来能够做到这一点的语言 (2认同)