相关疑难解决方法(0)

为什么变长数组不是C++标准的一部分?

在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.

显然在C99中,以下语法有效:

void foo(int n) {
    int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?

一些潜在的原因:

  • 毛茸茸的编译器供应商实现
  • 与标准的其他部分不兼容
  • 可以使用其他C++构造模拟功能

C++标准规定数组大小必须是常量表达式(8.3.4.1).

是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:

void foo(int x, int y, int z) {
    int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

vector版本变得很笨拙:

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)

切片,行和列也可能遍布整个内存.

看一下comp.std.c++这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector总是更好的解决方案.

c++ arrays standards variable-length variable-length-array

311
推荐指数
7
解决办法
14万
查看次数

C++ 14中的可变长度数组?

n3639提出将 s采用到C++ 14中(至少在第一维中是这样).

最新的我已经能够找到 n3639列表:

C++ 14的第一张CD中的功能,随后被删除到技术规范

这有没有成为技术规范,还是丢失了?

我的问题的原因是,我注意到这段代码:

void f(size_t n) {
    int a[n];
    for (size_t i = 0; i < n; ++i)
        a[i] = 2 * i;
    sort(a, a + n);
}
Run Code Online (Sandbox Code Playgroud)

这无法在Visual Studio 2015和gcc中构建(当使用"-pedantic"标志时).

做工精细下gcc5.1,但仍然未能建立的Visual Studio 2015年之下.

这只是gcc在C++ 14中错误地支持c99的可变长度数组,还是以某种方式使它成为C++ 14并且Visual Studio 2015无法将其提取出来?

编辑:看起来gcc已经删除了gcc6.2中的支持:http://coliru.stacked-crooked.com/a/303ae1970fa3f5d2

c++ arrays c99 variable-length-array visual-studio-2015

7
推荐指数
1
解决办法
4553
查看次数