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

Nik*_*iou 25 c++

我遇到了以下签名

double(&rotate_vec(double(&val)[4]))[4];
Run Code Online (Sandbox Code Playgroud)

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

double(&rotate_vec(double(&val)[4]))[4]
{
    // ... 
    return val;
}

int main()
{
    double ar[4] = { 1, 2, 3, 5 };
    rotate_vec(ar);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 这个c ++怎么样?你会怎么看?
  2. 我们不能从函数返回一个数组,只是指针,或者我们可以吗?

Che*_*Alf 28

使用C++ 03,您可以做到最好的简化原始版本

double(&rotate_vec(double(&val)[4]))[4];
Run Code Online (Sandbox Code Playgroud)

是用来表示typedef:

typedef double Four_vec[4];
Four_vec& rotate_vec( Four_vec& val );
Run Code Online (Sandbox Code Playgroud)

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

auto rotate_vec( double (&val)[4] )
    -> double (&)[4];
Run Code Online (Sandbox Code Playgroud)

虽然我用一个typedef或C++ 11 using来澄清.


关于

"我们不能从函数返回一个数组,只是指针,或者我们可以吗?"

你不能按值返回一个原始数组,但你可以返回一个指针或引用,或者你可以将它包装在一个结构中,如C++ 11 std::array.

  • 如果以这种方式书写+1,没有人会感到困惑 (4认同)

tem*_*boy 21

double ( &rotate_vec( double (&val)[4] ) )[4]
Run Code Online (Sandbox Code Playgroud)

一个名为的函数 rotate_vec

double ( &rotate_vec( double (&val)[4] ) )[4]
Run Code Online (Sandbox Code Playgroud)

......作为一个参数,一个四个双打数组的引用

double ( &rotate_vec( double (&val)[4] ) )[4]
Run Code Online (Sandbox Code Playgroud)

...并返回对四个双精度数组的引用.

  • @templateboy图像无法大声读出,不会使用反色方案显示,不能以不同/更大的字体显示,不会被翻译等.基本上,你(无意中)给任何人一个大的FU有点与众不同. (2认同)