为什么ISO C++禁止返回数组?

AnA*_*ons 9 c++ arrays c++14

我没有看到任何合乎逻辑的理由.我的意思是你可以通过使用包含这样的数组成员的结构轻松克服这个要求:

template <size_t n>
struct arr { int d[n]; };

auto fnReturningArray()
{
    return arr<3>{0, 1, 2};
};
Run Code Online (Sandbox Code Playgroud)

其行为方式与直接返回数组的方式完全相同,只是您应首先访问结构成员'd'以使用它.标准本身也通过'std :: array'类型添加了类似的功能.所以它似乎可以实现.为什么ISO C++禁止这个动作?也许遗留代码兼容性(但我很难相信这是因为添加的其他新东西已经很久了,例如'auto'关键字的新含义).

Chr*_*phe 2

除了标准不允许这样做以及可以解释它的历史原因之外,问题还在于语法

想象一下它是被允许的:你如何区分整个数组的命名、数组地址和单个元素的命名:

auto fnReturningArray()
{
    int a[3] = {0, 1, 2};
    return a;       // what is meant here ?  the address of the array ? or the whole array ?  
};
Run Code Online (Sandbox Code Playgroud)

如果您要更改现有规则的含义(例如将 a 表示为整个数组),那么遗留代码将会遇到巨大问题。

  • 这很简单:“a”是一个数组,因此意味着您要返回一个数组。如果你想要一个指向第一个元素的指针,你可以写“&amp;a[0]”。这不是 C++ 的工作方式,但它是一种完全合理的语言。 (9认同)
  • @LightnessRacesinOrbit 我并不是说现在将其添加到 C++ 中是有意义的,只是说如果 C++(甚至可能是 C)从一开始就是这样设计的,那就有意义了。 (7认同)
  • 假设您有一条规则,声明您要返回 `int[3]`,因为这是 `a` 的类型。如果语言允许返回数组,那么这就很有意义了。您在这里使用循环论证。 (2认同)
  • 如果返回数组是合法的,那么我们可以用它做什么呢?允许 `int foo[3],bar[3]; 似乎很奇怪 foo=funcReturningInt3Array();` 当 `foo=bar;` 被禁止时。如果 `int *moo; moo=funcReturningInt3Array();` 被允许,什么将决定数组的生命周期? (2认同)