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

时间:2014-05-01 20:26:30

标签: c++

我遇到了以下签名

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

在评论中"声明" 接受并返回四个元素的数组。我的第一反应是,这甚至看起来都不是标准的c ++ this compiles

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. 我们can't return an array from a function,只是指针,或者我们可以吗?

2 个答案:

答案 0 :(得分:28)

使用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];

虽然我使用typedef或C ++ 11 using来澄清。


关于

  

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

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

答案 1 :(得分:21)

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

名为rotate_vec

的函数
double ( &rotate_vec( double (&val)[4] ) )[4]

...作为参数,对四个双精度数组的引用

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

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