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

时间:2014-11-23 17:38:11

标签: c++ arrays c++14

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

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

auto fnReturningArray()
{
    return arr<3>{0, 1, 2};
};

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

2 个答案:

答案 0 :(得分:3)

除了标准不允许它以及可以解释它的历史原因之外,问题是句法

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

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

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

答案 1 :(得分:0)

我认为答案是双重的:

  1. 与C. C的兼容性并非如此。为什么?不知道。从各个方面开始,C从来都不是很合乎逻辑。

  2. C ++更喜欢库功能而不是语言功能。看到C ++ 98是第一个标准,它主要复制了C的基础知识(见第1点),这在第一个主要版本C ++ 11中得到了修正,它引入了库类型std :: array, ,作为一个纯粹而简单的库特性,解决了C风格阵列所带来的所有令人憎恶的怪癖。

  3. 总结一下:尽管为数组提供适当的值语义可能是有意义的,但它永远不会发生,因为可以解决明显的不足,而不会使语言比现在更复杂。摆脱遗留和向后兼容性非常困难,因此std :: array的当前选项确实是你想要的。用它。很简单。你喜欢它。很多。