众所周知,您无法返回对数组的引用。我读过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”这种方法有什么问题?我无法理解为什么人们在可能的情况下如此关心返回阵列。
答案 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
的函数,并且每次都有不同的值,并且单独的调用不会返回对同一状态的引用。你还没有解决他们的问题,你还做了别的事。