Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

I've come across the following signature

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

In the comments it "claims" to accept and return an array of four elements. My first reaction was that this does not even look standard c++ yet 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. How is this c++ ? How would you read it ?
  2. We can't return an array from a function, just pointers, or can we ?
like image 748
Nikos Athanasiou Avatar asked May 01 '14 20:05

Nikos Athanasiou


1 Answers

With C++03 the best you can do to simplify the original

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

is to use a typedef, to wit:

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

In C++11 you can write

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

although I'd use a typedef or C++11 using to clarify.


Regarding

“We can't return an array from a function, just pointers, or can we ?”

you can't return a raw array by value, but you can return a pointer or reference, or you can wrap it in a struct, like C++11 std::array.

like image 148
Cheers and hth. - Alf Avatar answered Sep 21 '22 03:09

Cheers and hth. - Alf