Что означает (&) - амперсанд в круглых скобках - означает в этом коде?

В этом ответе приведен следующий код (С++ 11):

template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
    return N;
}

Что означает (&) в этом контексте? Такие вещи чрезвычайно трудно найти.

Ответ 1

Это сокращает примерно следующее:

template <typename T, size_t N>
constexpr size_t size_of(T (&anonymous_variable)[N]) {
    return N;
}

В функции вам фактически не нужно имя переменной, просто вычитание шаблона на N - поэтому мы можем просто отказаться от нее. Скобки являются синтаксически необходимыми, чтобы передать массив по ссылке - вы не можете передать массив по значению.

Ответ 2

Передача массива в качестве параметра по ссылке:

template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
    return N;
}

Как вы не можете передать такой массив:

template <typename T, size_t N>
constexpr size_t size_of(T[N]) {
    return N;
}

Если массив получил имя, он будет выглядеть так:

template <typename T, size_t N>
constexpr size_t size_of(T (&arrayname)[N]) {
    return N;
}