我没有看到任何合乎逻辑的理由.我的意思是你可以通过使用包含这样的数组成员的结构轻松克服这个要求:
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'关键字的新含义).
除了标准不允许这样做以及可以解释它的历史原因之外,问题还在于语法:
想象一下它是被允许的:你如何区分整个数组的命名、数组地址和单个元素的命名:
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 表示为整个数组),那么遗留代码将会遇到巨大问题。