Подтвердить что ты не робот

Непостижимая подпись функции - Возвращает ссылку на массив из N объектов

Я столкнулся с следующей подписью

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

В комментариях он "утверждает" принимает и возвращает массив из четырех элементов. Моя первая реакция заключалась в том, что это даже не выглядит стандартным С++, но this компилирует:

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

int main()
{
    double ar[4] = { 1, 2, 3, 5 };
    rotate_vec(ar);
    return 0;
}
4b9b3361

Ответ 1

С С++ 03 лучшее, что вы можете сделать, чтобы упростить оригинал

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

- использовать typedef, а именно:

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

В С++ 11 вы можете написать

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

хотя я бы использовал typedef или С++ 11 using, чтобы уточнить.


Относительно

"Мы не можем вернуть массив из функции, просто указатели, или можем ли мы?"

вы не можете вернуть необработанный массив по значению, но вы можете вернуть указатель или ссылку, или вы можете обернуть его в структуру, например С++ 11 std::array.

Ответ 2

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

Функция с именем rotate_vec

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

..., который принимает в качестве аргумента ссылку на массив из четырех удвоений

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

... и возвращает ссылку на массив из четырех пар.