首页 > 解决方案 > 解释通过函数引用返回数组的语法

问题描述

C++中函数的语法是:

return_type function_name(parameter1, parameter2, ...)
{
    // function body
}

我对“从函数返回数组的引用”有一些疑问:

  1. 首先指定返回类型,然后指定函数名称,但要返回数组的引用,它被写为:

    // for array of size 10
    int (&f())[10] {
       return global;
    }        
    

    为什么?

  2. 能不能写成下面这样:

    // return type followed by function name
    int&[10] f(){
       return global;
    }
    

    或类似的东西(没有typedef)?

  3. 使用它时我无法理解 typedef 的用法:

    typedef int array_t[10];
    array_t& f() {
       return global;
    }
    

    上面的代码将如何简化?简化的代码会像第 1 点中的代码吗?

标签: c++arrayspass-by-referencereturn-typecompile-time

解决方案


  1. 为什么?

因为 Dennis Ritchie 将其设计为 C 语言,并且因为 C++ 被设计为与 C 兼容。

当然,C 中没有引用,但引用遵循与指针相同的语法规则,指针继承自 C。

然而,主要的困惑似乎并不在于引用标点符号的位置,而在于数组语法。数组大小总是在名称的右侧。同样的模式也适用于变量:

int arr[size];
|   |  |
|   |  size
|   name
element type

int (&arr_ref)[size];
|     |       |
|     |       size
|     name
element type

int (&f())[10]
|     |   |
|     |   size
|     name
element type

函数声明的不同之处仅在于它具有参数列表。它总是紧跟在名称之后。而且因为它紧跟在名称之后,所以它在数组大小之前。

  1. 能不能写成下面这样:

不,那在 C++ 中是不正确的。

  1. 使用它时我无法理解 typedef 的用法:

typedef只是一个别名;类型的不同名称。

这段代码将如何简化?

3. 中的代码非常简单。就个人而言,我更喜欢using类型别名的语法,而不是typedef

using array_t = int[10];

另一种选择是使用尾随返回类型,尽管这或多或少简单是主观的:

auto f() -> int(&)[10] {

它看起来像第 1 点中的代码吗?

声明看起来不同,但它声明了相同的函数。


推荐阅读