返回对数组的引用是否有意义?

时间:2015-03-06 23:26:24

标签: c++ arrays

众所周知,您无法返回对数组的引用。我读过Why doesn't C++ support functions returning arrays?,其中一个答案就是长期以来的猜测,这是一个设计决定。另一个答案建议使用矢量或结构(什么??),并说:

  

你返回的数组会降级为指针,所以你会这样做   仅仅从返回时就无法计算出它的大小。

但是,通过使用引用可以保留数组的大小也是一种常识。以下作品例如:

int arr[10];

int (&func())[10]
{
    return arr;
}

int main()
{
    int (&arr)[10] = func();
    for (int i = 0; i < 10; ++i)
        std::cout << i << " ";
}

除了通常的“你应该使用vector或std :: array”这种方法有什么问题?我无法理解为什么人们在可能的情况下如此关心返回阵列。

3 个答案:

答案 0 :(得分:1)

你似乎对vector不屑一顾。但是请确保您清楚地了解vector实际上是Java和许多其他流行语言中的数组的C ++等价物。不要被略微不同的声明语法误导。使用[]的C ++中的野兽与Java数组非常不同。

转到你的问题:是的,你可以通过引用返回一个C风格的数组。你的代码是正确的。但是它的使用案例很少,这可能就是你以前没见过的原因。

在现代C ++中,最好避免使用C风格的数组,因为它们不遵循其他对象所具有的值语义。 (例如,它们不能通过函数的值返回)。他们是从C继承的丑陋,不幸的是,完全从标准中删除已经为时已晚。

std::array<int, 10>一开始可能看起来很难看,但是当你尝试复制或移动或返回时,它会表现得很好。

答案 1 :(得分:1)

您编写的代码完全可以接受。为什么不经常这样做有很多原因:

  • 必须在编译时修复数组的大小。返回数组的许多函数都希望返回可变数量的元素。
  • 存储不能是函数的本地存储,或者如果存储必须是静态的。您从不想要返回对不再存在的对象的引用。它可能出现,这实际上是一件坏事 - 你马上就不会注意到你的错误。您的测试用例非常人为,您通常不会返回对全局的引用。

答案 2 :(得分:1)

  

另一个答案建议使用矢量或结构代替(什么?)

结构是可复制的,因此如果在结构中嵌入数组,则可以像普通值类型一样返回它。你不能用数组做到这一点。

  

我无法理解为什么人们在可能的情况下如此关心返回阵列。

因为您所做的事情并不是非常有用,所以它只是全局数组的访问者。您没有返回 new 数组,每次都返回相同的数组。这失败了:

auto arr1 = func();
auto arr2 = func();
arr1[0] = 1;
arr2[0] = 2;
assert( arr1[0] == 1 );   // fails

想要从函数返回数组的人想要在每次调用函数时返回不同的数组,而不是每次都引用同一个数组。同样地,您可以调用返回int的函数,并且每次都有不同的值,并且单独的调用不会返回对同一状态的引用。你还没有解决他们的问题,你还做了别的事。