不可理解的函数签名-返回对N个对象数组的引用

Incomprehensible function signature - Return reference to an array of N objects

本文关键字:对象 数组 引用 函数 可理解 返回      更新时间:2023-10-16

我遇到了以下签名

double(&rotate_vec(double(&val)[4]))[4];

在注释中,它"声称">接受并返回一个由四个元素组成的数组。我的第一反应是,这看起来甚至不是标准的c++,但它编译了:

double(&rotate_vec(double(&val)[4]))[4]
{
    // ... 
    return val;
}
int main()
{
    double ar[4] = { 1, 2, 3, 5 };
    rotate_vec(ar);
    return 0;
}
  1. 这个c++怎么样?你会怎么读
  2. 我们不能从函数返回数组,只能返回指针,还是可以

使用C++03,您可以做的最好的事情就是简化原始

double(&rotate_vec(double(&val)[4]))[4];

是使用typedef,也就是说:

typedef double Four_vec[4];
Four_vec& rotate_vec( Four_vec& val );

在C++11中,您可以编写

auto rotate_vec( double (&val)[4] )
    -> double (&)[4];

尽管我会使用CCD_ 2或C++11using来澄清。


关于

“我们不能从函数返回数组,只能返回指针,还是可以”

不能按值返回原始数组,但可以返回指针或引用,也可以将其封装在结构中,如C++11std::array

double ( &rotate_vec( double (&val)[4] ) )[4]

一个名为rotate_vec 的函数

double ( &rotate_vec( double (&val)[4] ) )[4]

以引用四个双数组为自变量

double ( &rotate_vec( double (&val)[4] ) )[4]

并返回对四个双打的数组的引用。