Что такое T (& var) [N]? - PullRequest
       21

Что такое T (& var) [N]?

4 голосов
/ 19 апреля 2011

В boost/utility/swap.hpp Я нашел этот кусок кода:

template<class T, std::size_t N>
void swap_impl(T (& left)[N], T (& right)[N])
{
  for (std::size_t i = 0; i < N; ++i)
  {
    ::boost_swap_impl::swap_impl(left[i], right[i]);
  }
}

Что такое left и right? Это ссылки на массивы? Разрешен ли этот код стандартом C ++ ISO 2003 или более поздней версии?

Ответы [ 4 ]

7 голосов
/ 19 апреля 2011

Ссылка на массив типа T и длины N.

Это естественное расширение синтаксиса указателя на массив C, которое поддерживается C ++ 03.

Вы можете использовать cdecl.org , чтобы попытаться проанализировать эти объявления сложных типов.

2 голосов
/ 19 апреля 2011

Что слева и справа? Это ссылки на массивы? Разрешен ли этот код стандартом C ++ ISO 2003 или более поздней версии?

Да. Они ссылаются на массивы.

Это означает, что вы можете позвонить swap_impl как:

int a[10]; //array
int b[10];
//...
swap_impl(a,b); //correct

Но вы не можете позвонить swap_impl как:

int *a = new int[10]; //pointer 
int *b = new int[10];
//...
swap_impl(a,b); //compilation error

Также обратите внимание, что вы не можете сделать даже это:

int a[10];
int b[11];
//...
swap_impl(a,b); //compilation error - a and b are arrays of different size!

Важный момент:

- Массивы должны быть не только аргументами, но и массивами одинакового размера!

1 голос
/ 19 апреля 2011

Да, это стандартный C ++, разрешенный с самого начала (в основном это C с добавлением ссылки).

Использование typedefs облегчает чтение:

int main()
{
    typedef  int (&MyArray)[4];
    int      data[4];
    MyArray  dataRef = data;
}

Это как бы отражает функцию typedef

typedef int (*MyFunc)();
1 голос
/ 19 апреля 2011

Это способ объявления ссылки на массив T (размером N) с именами left и right.Код допустим C ++.

Это позволяет вам передать:

int ones[5] = { 1,1,1,1,1 };
int twos[5] = { 2,2,2,2,2 };

swap_impl(ones, twos);

Тогда вывод типа шаблона будет знать, что у вас есть T = int и N = 5, и вы выполняете на местесвоп.Если вы не соответствуете типу или размеру, вы получите удобный сбой компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...